「git diffコマンドで比較する時のダブルドット(..)とトリプルドット(...)の違いとは?」という質問へのMark Longair氏の回答
git diff
コマンドは通常(「通常」というのは、例えばマージコンフリクトを解消する際などには3ウェイマージを表示することがあるため)、コミットグラフにおける完全な2つのポイント間のツリーの状態の違いを表示します。git diff
での..
と...
の表記は、以下の意味になります。
言い換えると、git diff foo..bar
はgit diff foo bar
と完全に同じです。どちらも2つのブランチfoo
とbar
の最新の変更同士の違いを表示します。一方で、git diff foo...bar
は、2つのブランチの「マージベース」とbar
の最新の変更との違いを表示します。「マージベース」とは通常、2つのブランチ間で共通な最後のコミットのことです。つまりこのコマンドは、bar
が始まった時のからの変更を表示し、その間にfoo
に対して行われた変更はまったく表示しない、ということです。
これがgit diff
の..
と...
表記に関して知るべきすべてのことです。しかし...
よくある混乱の元として、..
と...
は、1つ以上の引数としてコミットの集合を取るgit log
のようなコマンドでは微妙に違う意味になるということがあります(これらのコマンドはどれも引数のコミットの一覧をパースするのにgit rev-list
コマンドを使っています)。
git log
における..
と...
は、以下の図のように表せます。
つまりgit rev-list foo..bar
は、ブランチbar
にあってブランチfoo
にないものすべてを表示します。一方で、git rev-list foo...bar
は、foo
とbar
両方に存在するコミットすべてを表示します。3つ目の図は、2つのブランチを並べて書いた時、どちらかあるいは両方のブランチに存在するコミットが表示されることを示しています。
というわけで、色々と混乱しがちなのが分かります。いずれにしても、コミットの図は理解の手助けになるでしょう :)