Git diff コミット範囲におけるダブルドット「..」とトリプルドット「...」の違いは何ですか? 質問する

Git diff コミット範囲におけるダブルドット「..」とトリプルドット「...」の違いは何ですか? 質問する

次のコマンドの違いは何ですか?

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. トピックのヒントとマスター ブランチ間の変更。
  2. 同上。
  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 のコミットを指定するさまざまな方法の図解

つまり、 はとgit diff foo..barまったく同じですgit diff foo bar。どちらも、 と の 2 つのブランチの先端の違いを表示します。一方、 は、2 つのブランチの「マージ ベース」と の先端の違いを表示します。「マージ ベース」は通常、これら 2 つのブランチ間で共通する最後のコミットであるため、このコマンドは での作業によって導入された変更を表示し、その間にで行われたすべての変更を無視します。foobargit diff foo...barbarbarfoo

..のおよび...表記について知っておくべきことは以上ですgit diff。ただし...


... ここでよくある混乱の原因は、 などのコマンドで使用される場合、..と が...微妙に異なる意味を持つということです。たとえば、 は、コミットのセットを 1 つ以上の引数として期待します。(これらのコマンドはすべて、を引数からコミットのリストを解析するためにgit log使用します。)git rev-list

..および...の意味はgit log以下のようにグラフで表すことができます。

git log のコミット範囲を指定するさまざまな方法の図解

つまり、 は、ブランチ上になく、 ブランチ 上にあるgit rev-list foo..barすべてのものを表示します。一方、 は、またはのどちらか一方にあるすべてのコミットを表示しますが、両方にあるコミットは表示しません。3 番目の図は、2 つのブランチをリストすると、どちらか一方または両方にあるコミットが取得されることを示しています。barfoogit rev-list foo...barfoo bar

まあ、とにかく、それは少し混乱していると思いますが、コミット グラフの図が役立つと思います :)

¹「通常」とだけ言ったのは、たとえばマージの競合を解決するときに、git diff3 者間のマージが表示されるためです。

おすすめ記事