1. ホーム
  2. git

[解決済み] Git のコミット範囲におけるダブルドット "..." とトリプルドット "..." の違いは何ですか?

2022-03-19 17:03:26

質問

Git のコマンドの中には、コミット範囲を指定するものがあります。 .. また、別の構文では3つのドットを使用します。 ... .

両者の違いは何でしょうか?

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

を使用しているかどうかによります。 log コマンドか diff コマンドを使用します。には log の場合、それは man git-rev-parse のドキュメントを参照してください。

あるコミットから到達可能なコミットを除外するためには、接頭辞 ^ の表記を用います。例:^r1 r2 は r2 から到達可能なコミットを意味しますが、r1 から到達可能なコミットは除外されます。

このセット操作は非常に頻繁に登場します。 という略記があります。このような場合 2 つのコミット r1 と r2 がある場合 (名前は、(1) で説明した構文にしたがっています)。 リビジョンの指定) をすると 到達可能なコミットを要求する を除く、r2からの r1 からは "^r1 r2" で到達可能であり、これは は "r1..r2" のように書くことができます。

同様の表記で "r1...r2" もあります。 の対称差分といいます。 r2 は次のように定義されます。 $(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.

というのは少し曖昧ですね。基本的には、そのブランチと別のブランチの差分のみを表示するということです。あなたが最初に指定したコミッティと最後に共通するコミットを探し、そこに二番目のコミッティを差分として表示するのです。このブランチだけの変更を意識することなく、このブランチと比較してそのブランチでどのような変更が行われたのかを簡単に確認できる方法です。

.. はやや単純です。 git-diff の場合、それは git diff A B で、AをBに対して差分するだけです。 log の場合、B にあって A にないコミットがすべて表示されます。