240

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

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

diff マニュアルはそれについて語っています:

ブランチの比較

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

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

4

5 に答える 5

401

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

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

# Left side in the illustration below:
git diff foo..bar
git diff foo bar  # same thing as above

# Right side in the illustration below:
git diff foo...bar
git diff $(git merge-base foo bar) bar  # same thing as above

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

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

..のとの...表記について知っておく必要があるのはこれだけですgit diff。でも...


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

との意味は..、次のようにグラフィカルに表示できます。...git log

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

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

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

¹たとえば、マージの競合を解決するときにgit diff3方向のマージが表示されるため、「通常」とだけ言います。

于 2011-08-31T11:39:27.140 に答える
34

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

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

git diff foo...masterfooとmasterの共通の祖先(git merge-base foo master)とmasterの先端との違い。つまり、マスターブランチがfooとの共通の祖先以降に導入した変更のみを示しています。

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

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

$ git diff master dev

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

本当に比較したいのは、ブランチが分岐してから「dev」が何を変更したかです。そのために、Gitにはちょっとした速記があります。

$ git diff master...dev
于 2011-08-31T02:52:20.283 に答える
6
git diff foo master

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

git diff foo..master

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

git diff foo...master

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

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

于 2011-08-31T02:46:28.360 に答える