次のコマンドの違いは何ですか?:
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>
- トピックのヒントとマスターブランチ間の変更。
- 同上。
- トピックブランチが開始されてからマスターブランチで発生した変更。
しかし、私には完全に明確ではありません。
これらの画像はすでに作成しているので、_..
_(ドット-ドット)と_...
_(ドット-ドット-ドット)は、本質的に manojldsの答え 。と同じです
コマンド_git diff
_は通常、コミットグラフの正確に2つのポイント間のツリーの状態の違いのみを表示します。 _..
_の_...
_および_git diff
_表記には、次の意味があります。
つまり、_git diff foo..bar
_は_git diff foo bar
_とまったく同じです。両方とも、2つのブランチfoo
とbar
のヒントの違いを示します。一方、_git diff foo...bar
_は、2つのブランチの「マージベース」とbar
の先端の違いを示します。通常、「マージベース」はこれらの2つのブランチ間で共通する最後のコミットです。したがって、このコマンドはbar
で行われた変更を表示し、foo
で行われたすべてを無視します。その間。
_..
_の_...
_および_git diff
_表記について知っておく必要があるのはこれだけです。しかしながら...
...ここでの一般的な混乱の原因は、_..
_と_...
_が、コミットのセットを1つ以上の引数として期待する_git log
_などのコマンドで使用される場合、微妙に異なることを意味することです。 (これらのコマンドはすべて _git rev-list
_ を使用して、引数からコミットのリストを解析します。)
_..
_の_...
_および_git log
_の意味は、以下のようにグラフィカルに表示できます。
したがって、_git rev-list foo..bar
_は、ブランチbar
にはないブランチfoo
のすべてを表示します。一方、_git rev-list foo...bar
_は、foo
orbar
にあるすべてのコミットを表示しますが、 両方ではない。 3番目の図は、2つのブランチをリストすると、その一方または両方にあるコミットを取得することを示しています。
まあ、とにかく少し混乱していることがわかり、コミットグラフ図が役立つと思います:)
¹マージの競合を解決するとき、たとえば_git diff
_は3者間マージを表示するため、「通常」とだけ言います。
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
git diff foo master
その時点でのトピックブランチとマスターブランチの違いが表示されます
git diff foo..master
これにより、その時点でのトピックとマスターブランチの違いも表示されます。
git diff foo...master
これにより、トピックがブランチから作成されたときとその後の違いがすべて表示されます
したがって、最初の2つのコマンドは同じで、最後のコマンドは差分履歴でより広いビューを表示するだけです