次のコマンドの違いは何ですか?
git diff foo master # a
git diff foo..master # b
git diff foo...master # c
diff マニュアルではこれについて次のように説明しています:
ブランチの比較
$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
- トピックのヒントとマスター ブランチ間の変更。
- 同上。
- トピック ブランチが開始されてからマスター ブランチで発生した変更。
しかし、私には完全には分かりません。
ベストアンサー1
..
これらの画像はすでに作成してあったので、別の回答で使用する価値があると思いましたが、 (dot-dot) と(dot-dot-dot)の違いの説明は、基本的にmanojlds の回答...
と同じです。
このコマンドはgit diff
通常、コミット グラフ内の 2 つのポイント間のツリーの状態の違いのみを表示します。 の..
および...
表記のgit diff
意味は次のとおりです。
# Left side in the illustration below:
git diff foo..bar
git diff foo bar # same thing as above
# Right side in the illustration below:
git diff foo...bar
git diff $(git merge-base foo bar) bar # same thing as above
つまり、 はとgit diff foo..bar
まったく同じですgit diff foo bar
。どちらも、 と の 2 つのブランチの先端の違いを表示します。一方、 は、2 つのブランチの「マージ ベース」と の先端の違いを表示します。「マージ ベース」は通常、これら 2 つのブランチ間で共通する最後のコミットであるため、このコマンドは での作業によって導入された変更を表示し、その間にで行われたすべての変更を無視します。foo
bar
git diff foo...bar
bar
bar
foo
..
のおよび...
表記について知っておくべきことは以上ですgit diff
。ただし...
... ここでよくある混乱の原因は、 などのコマンドで使用される場合、..
と が...
微妙に異なる意味を持つということです。たとえば、 は、コミットのセットを 1 つ以上の引数として期待します。(これらのコマンドはすべて、を引数からコミットのリストを解析するためにgit log
使用します。)git rev-list
..
および...
の意味はgit log
以下のようにグラフで表すことができます。
つまり、 は、ブランチ上になく、 ブランチ 上にあるgit rev-list foo..bar
すべてのものを表示します。一方、 は、またはのどちらか一方にあるすべてのコミットを表示しますが、両方にあるコミットは表示しません。3 番目の図は、2 つのブランチをリストすると、どちらか一方または両方にあるコミットが取得されることを示しています。bar
foo
git rev-list foo...bar
foo
bar
まあ、とにかく、それは少し混乱していると思いますが、コミット グラフの図が役立つと思います :)
¹「通常」とだけ言ったのは、たとえばマージの競合を解決するときに、git diff
3 者間のマージが表示されるためです。