特定のコミットに対して、それが対象のブランチへ、どのマージコミットでマージされたかを判定するには？


あるトピックブランチ上のコミット A が、特定のブランチ B (eg. develop) へマージされているとします。

このコミットAがブランチBへマージされた際のマージコミットがどれであるかを判定したいのですが、これはどうやったら実現できますでしょうか。

* * *

追記: コミットAがブランチBへマージされるマージコミットとは、ブランチBからfirst parent
のみを辿って得られる歴史の上で、一番最古の、コミットAの子孫であるマージコミットのことです。




bash 依存になりますが、以下の方法はいかがでしょうか。  
他のシェルでも、プロセス置換が行えるなら同様のことはできると思います。

[code]

    grep -Fxf \
      <(git log --first-parent --merges --pretty=format:%H B; echo) \
      <(git log --ancestry-path --merges --pretty=format:%H A..B; echo) \
    | tail -n 1
    
[/code]

需要がありそうな要望なので、git のみでもっと簡単にできそうな気もしますが、方法を見付けられなかったので他コマンドと組み合わせました。

なお、A が B
へマージされたものではなく、Bの最初の子孫から辿り着けるものだった場合、全く関係ない最古のマージコミットが結果として表示されてしまうので注意して下さい。

## 解説

上記コマンドの各断片の意味は以下の通りです。

  * `grep -Fxf A B`  
ファイル A と B の共通の行を取り出すイディオム。  
ここでは A と B としてコマンドのプロセス置換を記述することにより、ふたつのコマンドの出力の共通行を取り出しています。

  * `git log --first-parent --merges --pretty=format:%H B`  
Bからfirst parent のみを辿って得られるマージコミットのハッシュのみを列挙します。この後に
`echo`が続いているのは、最後の出力行に付かない改行を補完するためです。

  * `git log --ancestry-path --merges --pretty=format:%H A..B`  
Bとその祖先のうち、Aの子孫であるマージコミットのハッシュを列挙します。これも改行を補完するため `echo` を付けています。

  * `tail -n 1`  
標準入力の最後の行を表示します。

これらを組み合わせることによって、

> Bからfirst parent のみを辿って得られる歴史の上で、一番最古の、コミットAの子孫であるマージコミット

のハッシュが得られます。




bash 依存になりますが、以下の方法はいかがでしょうか。  
他のシェルでも、プロセス置換が行えるなら同様のことはできると思います。

[code]

    grep -Fxf \
      <(git log --first-parent --merges --pretty=format:%H B; echo) \
      <(git log --ancestry-path --merges --pretty=format:%H A..B; echo) \
    | tail -n 1
    
[/code]

需要がありそうな要望なので、git のみでもっと簡単にできそうな気もしますが、方法を見付けられなかったので他コマンドと組み合わせました。

なお、A が B
へマージされたものではなく、Bの最初の子孫から辿り着けるものだった場合、全く関係ない最古のマージコミットが結果として表示されてしまうので注意して下さい。

## 解説

上記コマンドの各断片の意味は以下の通りです。

  * `grep -Fxf A B`  
ファイル A と B の共通の行を取り出すイディオム。  
ここでは A と B としてコマンドのプロセス置換を記述することにより、ふたつのコマンドの出力の共通行を取り出しています。

  * `git log --first-parent --merges --pretty=format:%H B`  
Bからfirst parent のみを辿って得られるマージコミットのハッシュのみを列挙します。この後に
`echo`が続いているのは、最後の出力行に付かない改行を補完するためです。

  * `git log --ancestry-path --merges --pretty=format:%H A..B`  
Bとその祖先のうち、Aの子孫であるマージコミットのハッシュを列挙します。これも改行を補完するため `echo` を付けています。

  * `tail -n 1`  
標準入力の最後の行を表示します。

これらを組み合わせることによって、

> Bからfirst parent のみを辿って得られる歴史の上で、一番最古の、コミットAの子孫であるマージコミット

のハッシュが得られます。

