あるいは、ある二つのコミットが、
- どちらも master ブランチに含まれているか
- どちらのコミットのほうが先に master ブランチにマージされたか
を調べる方法。
git name-rev --refs master を使った。
$ git log --oneline -1 5d42715 Merge pull request #1048 from quipper/awesome-branch $ bundle show schema /Users/kyanny/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/bundler/gems/schema-45569067e8bb $ git log --oneline -1 ab2f0fe Merge pull request #1129 from quipper/yet-another-awesome-branch $ git name-rev --refs master 5077d26194181521de8a1ccc0f02782416795452 # A 5077d26194181521de8a1ccc0f02782416795452 master~5^2 $ git name-rev --refs master 38883c52ad5c1657b89963e48c505c9f9f92574e # B 38883c52ad5c1657b89963e48c505c9f9f92574e master~5 # C $ git name-rev --refs master 45569067e8bb 45569067e8bb master~1
解説
ある Rails アプリが schema という別の gem に依存しており、 schema 側の変更を取り込むために任意のタイミングで bundle update している。
自分が取り込みたい変更は 5077d26194181521de8a1ccc0f02782416795452 のコミット(以下 A)で、 schema リポジトリではすでに master にマージされている。38883c52ad5c1657b89963e48c505c9f9f92574e がマージコミット(以下 B)。
ところが別の作業で schema のリビジョンが更新されており、現在 Rails プロジェクトの master HEAD では schema の 45569067e8bb を使っている(以下 C)。
ここで、 A も C も master に含まれていることはわかっているが、どっちが先祖にあたるのかを知りたい。
図で示すと、↓が期待する歴史
---A---C---master
↓のようになっていると、 A はまだ Rails アプリ側には取り込まれていないということなので、困る。
---C---A---master
これを、 git show でタイムスタンプを調べたりするのではなく、もっと明らかな形で確かめたかった(タイムスタンプは前後することがあってあてにならないし、 GitHub Issues 等でテキストベースでやり取りしているとき結果をコピペして説明しづらい)
そこで冒頭の一連のコマンドを使った。 --refs master をつけないと remotes/origin/ultra-super-awesome-branch~3^2 のような結果が出てきてしまい、わかりづらかった。
冒頭のコマンドの実行結果でいうと、
- A のマージコミットが B なので
---A---B---masterが常に成り立つ - A は
master~5^2なので master からみて少なくとも 5 つ前のコミットにあたる - C は
master~1なので master からみて 1 つ前のコミットにあたる
以上から、 ---A---B---C---master が成り立ち、コミット A は無事 Rails アプリに取り込まれていることがわかった。
参考
git name-revについては git で指定したコミットがどのブランチに属するか知りたい - QA@IT のベストアンサー~(チルダ)や^(キャレット)の記号の意味については Gitのコミット指定時に使うキャレット(^)とチルダ(~)の違い - chulip.org