Git差分コミット範囲のダブルドット「..」とトリプルドット「…」の違いは何ですか?


188

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

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c

差分マニュアルはそれについて話します:

ブランチの比較

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. トピックのヒントとマスターブランチの間の変更。
  2. 同上。
  3. トピックブランチが開始されたときからマスターブランチで発生した変更。

私には完全には分かりません。


質問が重複し、されていないが、この回答をグラフの意味のショー.....git diff、その異なる意味でgit log
Mark Longair、2011

回答:


333

これらの画像はすでに作成しているので、別の回答で使用する価値があると思いましたが、..(ドット-ドット)と...(ドット-ドット-ドット)の違いの説明は、manojldsの回答と基本的に同じです。

git diff通常、このコマンドは、コミットグラフの2つのポイント間のツリーの状態の違いのみを表示します。表記の意味は次のとおりです。.....git diff

git diffのコミットを指定するさまざまな方法の図

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

..との...表記について知っておくべきことは、これだけですgit diff。しかしながら...


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

意味.....のためには、git log以下のようにグラフィカルに示すことができます。

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

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

とにかく、私はとにかく少し混乱することがわかりました、そして私はコミットグラフ図が役立つと思います:)

mergeたとえば、マージの競合を解決するときにgit diff、3者間マージが表示されるため、「一般的に」とだけ言います。


1
私はあなたの図が好きです。私も少し前に自分で考えました。自分でgit diff作成した図について、後で作成するアイデアがいくつかあります。

34
誰かが気づきましたか?の効果..と(と比較して)逆転した...感じ!git diffgit rev-list
Robert Siemer、2015

2
「あなたが知る必要があるのはそれだけです[...]。しかし...」。:-) Gitはこのようなものでいっぱいです。類似した表記法と用語は異なるコンテキストで異なることを意味します。これを明確にしてくれてありがとう。
ShreevatsaR 2015

rev-listについて言及していただきありがとうございます。rev-parseを介してrev-listが実行する方法を探しているときに、この質問に出くわしました。
Mad Physicist

「言い換えれば、git diff foo..barはとまったく同じgit diff foo barです。どちらも、fooとbarの2つのブランチの先端の違いを示します。」「2つの枝の先端の違い」とはどういう意味ですか?
Asad Moosvi 2017

59

私の連結バージョン.....との差分ログ

差分vsログ&.. vs ..


3
これは、../ と混ざり合って色や設定操作がそれほど多くない場合に非常に適してい...ます。たとえばlog A...B、コマンドが交差(図の白い部分)を返すのか、ABユニオンの残りの部分(緑色)を返すのかは明確ではありません。これは、セットオペランドがなく、色が1つだけの場合に、より重要になります。
xealits 2018年

1
これは実際にdiff A..B<—> log A...Bである必要がありますか。つまり、実際には2つのドットで差分があり、3つの(!)ドットで対数に対応していますか。または、画像にタイプミスがあります。ドットがどのように色分けされているかを見ると、画像にタイプミスがあるようです。左下隅:、右(?)であるlog A...B必要がlog A..Bあります。そして、ちょうど右にあるログはすべきではあり...ません..
KajMagnus

1
こんにちはDolphinDream、あなたの姿をありがとう。ここで参照として使用します:gitlab.com/tortoisegit/tortoisegit/issues/3427#note_227200695
Yue Lin Ho

1
@KajMagnusは、実際には赤/青の色が2ドットと3ドットを区別するために使用されています(diffまたはlogで使用されているかどうかは関係ありません)。図は正しいです。最初の列では、2ドットを使用したdiffの結果は、3ドットを使用したログに似ています(したがって、最初に目的図全体を使用します)。2ドットの差分は、両方の回転で分岐点までのコード変更を示します(コミットの周りの緑の泡とバン図の緑の部分で示されています)。3ドットのログは変更ログ(コミットメッセージ)を示します。両方の回転で分岐点まで。
DolphinDream

28

git diff foo master fooとmasterのトップ(ヘッド)コミットの差分。

git diff foo..master 同じことをする別の方法。

git diff foo...mastergit merge-base foo masterfooとmaster の共通の祖先()からmasterのtipとは異なります。つまり、fooとの共通の祖先以降にマスターブランチが導入した変更のみを表示します。

この GitHubの例では、2つを使用するタイミングについて説明しています。

たとえば、 'dev'ブランチを作成して関数をファイルに追加した場合、 'master'ブランチに戻ってREADMEから行を削除し、次のように実行します。

$ git diff master dev

最初のファイルから関数が追加され、READMEに行が追加されたことがわかります。どうして?ブランチ上にあるREADMEにはまだ元の行がありますが、「マスター」では削除されているため、スナップショットを直接比較すると「dev」が追加したように見えます。

あなたが本当に比較したいのは、あなたのブランチが分岐して以来、 'dev'が何を変更したかです。そのために、Gitにはちょっとした省略形があります。

$ git diff master...dev

2
git diff foo ... masterブランチが導入したfooの共通の祖先であるmasterブランチの変更
0fnt

@manojldsわかりました。別の質問です。devブランチにいて変更(関数)​​をコミットし、変更をリモートdevブランチにプッシュする場合、これは目に見える変更が関数または関数とreadmeだけであることを意味しますか?
デビッド

私が間違っていない場合、GitHubのプルリクエストの差分ではトリプルドットが使用されます。そうですか?
Shaun Luttin 2017年

GitHubサンプルページへのリンクが壊れています。
K.-Michael Aye

6
git diff foo master

その時点でのトピックとマスターブランチの違いを示します

git diff foo..master

これにより、その時点でのトピックとマスターブランチの違いも表示されます

git diff foo...master

これは、トピックがブランチから作成された時期とその後の差異をすべて示します。

したがって、最初の2つのコマンドは同じで、最後のコマンドは差分履歴でより広いビューを表示するだけです


1

gitログツリー

上の画像は下のグラフツリーに相当します

A0 <- A1 <- A2 <- A3 (master)
   \
    C0 <- C1 (test)

写真は千の言葉の価値があり、その違いを.. ... ^以下に示します。

$ git log master..test
# output C0 C1

$ git log ^master test
# output C0 C1

$ git log master…test
# output A1 A2 A3 C0 C1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.