想象一下下面的历史:

       c---e---g--- feature
      /         \
-a---b---d---f---h--- master

我怎么能找到当提交“c”已合并到主(即,找到合并提交“h”)?


当前回答

对于Ruby人群来说,有git- where。非常容易。

$ gem install git-whence
$ git whence 1234567
234557 Merge pull request #203 from branch/pathway

其他回答

Git-get-merge将定位并显示你正在寻找的合并提交:

pip install git-get-merge
git get-merge <SHA-1>

该命令跟随给定提交的子分支,直到发现合并到另一个分支(假设是主分支)。

基于Gauthier的回答,我们不需要使用comm来比较列表。因为我们在——ancestry-path中寻找最后一个结果,它也在——first-parent中,我们可以简单地在前者的输出中grep后者:

git rev-list <SHA>..master --ancestry-path | grep -f <(git rev-list <SHA>..master --first-parent) | tail -1

或者为了更简洁和可重用,这里有一个可以弹出到.bashrc的函数:

function git-find-merge() {
  git rev-list $1..master --ancestry-path | grep -f <(git rev-list $1..master --first-parent) | tail -1
}
git log --topo-order

然后在提交之前寻找第一个合并。

我需要这样做,并以某种方式找到了git-when-merged(它实际上引用了这个SO问题,但Michael Haggerty从未在这里添加对他非常出色的Python脚本的引用)。现在我有了。

也就是说,总结一下Gauthier的文章:

perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' <(git rev-list --ancestry-path <SHA-1_for_c>..master) <(git rev-list --first-parent <SHA-1_for_c>..master) | tail -n 1

EDIT:因为它使用进程替换“<()”,所以它不兼容POSIX,并且它可能无法与您的shell一起工作。不过,它适用于bash或zsh。