web-dev-qa-db-ja.com

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

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

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. トピックブランチが開始されてからマスターブランチで発生した変更。

しかし、私には完全に明確ではありません。

167
chrisjlee

これらの画像はすでに作成しているので、_.._(ドット-ドット)と_..._(ドット-ドット-ドット)は、本質的に manojldsの答えと同じです

コマンド_git diff_は通常、コミットグラフの正確に2つのポイント間のツリーの状態の違いのみを表示します。 _.._の_..._および_git diff_表記には、次の意味があります。

An illustration of the different ways of specifying commits for 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_の意味は、以下のようにグラフィカルに表示できます。

An illustration of the different ways of specifying ranges of commits for git log

したがって、_git rev-list foo..bar_は、ブランチbarにはないブランチfooのすべてを表示します。一方、_git rev-list foo...bar_は、fooorbarにあるすべてのコミットを表示しますが、 両方ではない。 3番目の図は、2つのブランチをリストすると、その一方または両方にあるコミットを取得することを示しています。

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

¹マージの競合を解決するとき、たとえば_git diff_は3者間マージを表示するため、「通常」とだけ言います。

284
Mark Longair

..vs...の統合バージョンdiffvslog

Diff vs Log & .. vs ..

42
DolphinDream

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

git diff foo..master同じことを行う別の方法。

git diff foo...master共通​​の祖先との違い(git merge-base foo master)fooとmasterからmasterのtipへ。つまり、fooとの共通の祖先以降にmasterブランチが導入した変更のみを示します。

この例 GitHubの2つをいつ使用するかを説明します。

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

$ git diff master dev

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

本当に比較したいのは、ブランチが分岐してから「開発者」が変わったことです。それを行うために、Gitには素敵な短い略記があります。

$ git diff master...dev
26
manojlds
git diff foo master

その時点でのトピックブランチとマスターブランチの違いが表示されます

git diff foo..master

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

git diff foo...master

これにより、トピックがブランチから作成されたときとその後の違いがすべて表示されます

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

6
italiano40