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


回答:


251

logコマンドを使用しているか、diffコマンドを使用しているかによって異なります。そのlog場合、それはman git-rev-parseドキュメントにあります:

コミットから到達可能なコミットを除外するには、プレフィックス^表記を使用します。たとえば、^ r1 r2は、r2から到達可能なコミットを意味しますが、r1から到達可能なコミットは除外します。

この集合演算は頻繁に出現するため、省略形があります。2つのコミットr1とr2(上記の「リビジョンの指定」で説明されている構文に従って名前が付けられている)がある場合、r2から到達可能なコミットを要求できます。 「r1..r2」。

同様の表記「r1 ... r2」は、r1とr2の対称差と呼ばれ、「r1 r2 --not $(git merge-base --all r1 r2)」として定義されます。これは、r1またはr2のいずれかから到達可能で、両方からは到達できないコミットのセットです。

つまり、基本的には、2つのブランチのいずれか一方にあるが両方にはないすべてのコミットを取得することになります。

そのdiff場合、それはman git-diffドキュメントにあります:

  git diff [--options] <commit>...<commit> [--] [<path>...]

      This form is to view the changes on the branch containing and up to
      the second <commit>, starting at a common ancestor of both
      <commit>. "git diff A...B" is equivalent to "git diff
      $(git-merge-base A B) B". You can omit any one of <commit>, which
      has the same effect as using HEAD instead.

これは少しあいまいです。基本的には、そのブランチの別のブランチとの違いのみを表示することを意味します。最初に指定したコミットで最後の共通コミットを探し、次に2番目のコミットを比較します。これは、このブランチでの変更に気付かずに、このブランチと比較して、そのブランチで行われた変更を確認する簡単な方法です。

..幾分簡単である:でgit-diff場合、それは同じだgit diff A Bとだけで、Bに対してAをdiffをlogする場合、それはBに記載されていなくA.内のすべてのコミットを示します


31
これは、の意味どのようにかなりばかげ.....正確にlogやdiffのためにスワップされています。log A..BあるものであるBにマージベースから変更diff A...Bありません
phiresky

1
@phireskyええ、それは本当に使い勝手が悪いです。にはドット表記を使用しないことをお勧めしますgit diff
wisbucky

2
これはA...B==を意味しA..B + B..Aますか?
Danon

2
@Danonはgit logこれは絶対に可能です
maoizm

659

Gitログでのコミット範囲の使用

.....でコミット範囲を使用しているgit log場合の違いは、ブランチAとBの場合、

git log A..B

BがAが持っていないすべてのコミットを表示します

git log A...B

Aが持っているコミットとBが持っていないコミット、およびBが持っているAが持っていないコミットの両方を表示します。つまり、AとBの両方が共有するすべてのコミットを除外します。したがって、両方が共有していないコミットのみを表示します

ベン図とコミットツリーによる視覚化

これはの視覚的表現ですgit log A..B。ブランチBに含まれ、Aに存在しないコミットは、コミット範囲によって返されるものであり、ベン図では赤で強調表示され、コミットツリーでは青で囲まれています。

 「git log A..B」ダイアグラムツリー1

これらはの図ですgit log A...B。両方のブランチで共有されているコミットは、コマンドでは返されないことに注意してください。

 「git log A ... B」ダイアグラムツリー2

トリプルドットのコミット範囲を作る ...より便利にする

...--left-rightオプションを使用して、どのコミットがどのブランチに属しているかを表示するオプションを使用することで、トリプルドットのコミット範囲をlogコマンドでより便利にすることができます。

$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt

上記の出力では、に属するコミットにmasterは接頭辞が付いているのがわかりますが、属する<コミットにorigin/masterは接頭辞が付いてい>ます。

Git Diffでコミット範囲を使用する

いつか私はコミット範囲がどのように機能するかについて独自の説明を追加するかもしれませんgit diffが、今のところ、Git diff commitのダブルドット「..」とトリプルドット「...」の違いを確認したいと思うかもしれません範囲?

こちらもご覧ください


35
この答えは、簡潔なテキスト、例、写真で違いを実際に説明しています。私は、不明確なドキュメントを引用している、現在最も投票されている回答よりもはるかに気に入っています。(tl; drこの回答のおかげで、私は実際に違いを理解しています。)
aerique

4
@Cupcakeに意味を付け加えてもらえますか... git diffで?
Marius 14

1
@Marius実際、あなたがそれを取り上げたので、あなたのような将来の読者のために、私は先に進み、私の答えにある他の質問にリンクします。

2
これは実際には反対ではないですか?dig diff a..bはすべてのdiff、または基本的にgit diff a bと同じです。一方、git dif a ... bは、aからの分岐以降にbが行った変更のみです。
wejrowski

2
少なくともgit logでは。git diffの場合、状況が逆になる可能性があります。stackoverflow.com
Benjamin Atkin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.