1. ホーム
  2. ギット

[解決済み】Git diffのコミット範囲にあるダブルドット「...」とトリプルドット「...」の違いは何ですか?重複] [重複] [重複] [重複] [重複] [重複

2022-04-03 15:08:11

質問

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

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. トピックのヒントとmasterブランチの間の変更点。
  2. 同上
  3. master ブランチからトピックブランチを開始したとき以降に master ブランチで発生した変更。

が、私には全く理解できません。

どのように解決するのですか?

との違いの説明は、すでにこの画像を作成していたので、別の回答で使う価値があるかもしれないと思ったのです。 .. (ドットドット)と ... (ドット・ドット・ドット)は、基本的に manojldsさんの回答 .

コマンド git diff typically¹ は、コミットグラフのちょうど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

言い換えれば git diff foo..bar とは全く同じです。 git diff foo bar どちらも、2本の枝の先端の違いを表示します。 foobar . 一方 git diff foo...bar は、2つのブランチの "マージベース" と、その先端の bar . マージベースとは、通常、2つのブランチ間で共通する最後のコミットのことです。 bar で行われたことはすべて無視されます。 foo その間に

については以上です。 ..... の表記は git diff . しかし...


... ここでよくある混乱の元となるのが ..... のようなコマンドで使われる場合、微妙に異なることを意味します。 git log は、1つまたは複数の引数としてコミットのセットを期待します。 (これらのコマンドは、最終的に git rev-list を使用して、引数からコミット一覧をパースします)。

の意味は ..... に対して git log は、以下のようにグラフ化される。

だから git rev-list foo..bar はブランチ上のすべてを表示します。 bar ブランチにないものは foo . 一方 git rev-list foo...bar のどちらかにあるすべてのコミットを表示します。 foo または bar が、しかし 両方ではない . 3つ目の図は、2つのブランチをリストアップすると、どちらか一方または両方にあるコミットが得られることを示しているだけです。

まあ、とにかく、ちょっとわかりにくいので、コミットグラフの図が役に立つと思います :)

¹ マージコンフリクトを解決するときなどは、"typically" としか言わないので。 git diff を実行すると、3 者間マージが表示されます。