web-dev-qa-db-ja.com

Gitコミット範囲の二重ドット「..」と三重ドット「...」の違いは何ですか?

一部のGitコマンドはコミット範囲を使用し、1つの有効な構文は2つのコミット名を2つのドット..で区切るもので、別の構文は3つのドット...を使用します。

2つの違いは何ですか?

356
Pat Notz

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

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

この集合演算は非常に頻繁に現れるため、省略形があります。 2つのコミットr1およびr2(上記の改訂の説明で説明されている構文に従って命名された)がある場合、r1から到達可能なコミットを「^ r1 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と同じであり、AをBと比較します。logの場合、 Bにありますが、Aにはありません。

222
Pieter

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

.....とともにgit logなどのコミット範囲を使用している場合、それらの違いは、ブランチAとBの場合、

git log A..B

Bが持っているコミットのうち、Aが持っていないすべてのコミット

git log A...B

both Aが持っているコミットとBが持っていないコミット、およびBが持っているコミットがAを持っていないコミット、または言い換えれば、AとBの両方が共有するすべてのコミットをフィルターで除外するため、両方が共有しないコミットのみを表示する

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

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

"git log A..B" diagramTree 1

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

"git log A...B" diagramTree 2

トリプルドットコミット範囲の作成...の有用性の向上

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

$ 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コミット範囲の「...」?

こちらもご覧ください

560
user456814