Yakstは、海外の役立つブログ記事などを人力で翻訳して公開するプロジェクトです。
12ヶ月前投稿 修正あり

git diffコマンドで比較する時のダブルドット(..)とトリプルドット(...)の違いとは?

Gitでブランチ(コミット)間の違いを表示するgit diffコマンドに存在するダブルドット(..)記法とトリプルドット(...)記法の違いについて、Stackoverflowの分かりやすい回答。
原文 What are the differences between double-dot ".." and triple-dot "..." in Git diff commit ranges? - Stack Overflow (English)
ライセンス CC BY-SA
翻訳者 D98ee74ffe0fafbdc83b23907dda3665 doublemarket


git diffコマンドで比較する時のダブルドット(..)とトリプルドット(...)の違いとは?」という質問へのMark Longair氏の回答


git diffコマンドは通常(「通常」というのは、例えばマージコンフリクトを解消する際などには3ウェイマージを表示することがあるため)、コミットグラフにおける完全な2つのポイント間のツリーの状態の違いを表示します。git diffでの.....の表記は、以下の意味になります。

git diffでのダブルドットとトリプルドットの違い

言い換えると、git diff foo..bargit diff foo barと完全に同じです。どちらも2つのブランチfoobarの最新の変更同士の違いを表示します。一方で、git diff foo...barは、2つのブランチの「マージベース」とbarの最新の変更との違いを表示します。「マージベース」とは通常、2つのブランチ間で共通な最後のコミットのことです。つまりこのコマンドは、barが始まった時のからの変更を表示し、その間にfooに対して行われた変更はまったく表示しない、ということです。

これがgit diff.....表記に関して知るべきすべてのことです。しかし...


よくある混乱の元として、.....は、1つ以上の引数としてコミットの集合を取るgit logのようなコマンドでは微妙に違う意味になるということがあります(これらのコマンドはどれも引数のコミットの一覧をパースするのにgit rev-listコマンドを使っています)。

git logにおける.....は、以下の図のように表せます。

git logでのダブルドットとトリプルドットの違い

つまりgit rev-list foo..barは、ブランチbarにあってブランチfooにないものすべてを表示します。一方で、git rev-list foo...barは、foobar両方に存在するコミットすべてを表示します。3つ目の図は、2つのブランチを並べて書いた時、どちらかあるいは両方のブランチに存在するコミットが表示されることを示しています。

というわけで、色々と混乱しがちなのが分かります。いずれにしても、コミットの図は理解の手助けになるでしょう :)

次の記事
DNSの仕組み
前の記事
初心者がデータベースを扱うときにやってしまいがちな5つのミス

Feed small 記事フィード