想象一下下面的历史:

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

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


当前回答

git log --topo-order

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

其他回答

我的ruby版本的@robinst的想法,工作速度快了两倍(这在搜索非常旧的提交时很重要)。

find-commit.rb

commit = ARGV[0]
master = ARGV[1] || 'origin/master'

unless commit
  puts "Usage: find-commit.rb commit [master-branch]"
  puts "Will show commit that merged <commit> into <master-branch>"
  exit 1
end

parents = `git rev-list #{commit}..#{master} --reverse --first-parent --merges`.split("\n")
ancestry = `git rev-list #{commit}..#{master} --reverse --ancestry-path --merges`.split("\n")
merge = (parents & ancestry)[0]

if merge
  system "git show #{merge}"
else
  puts "#{master} doesn't include #{commit}"
  exit 2
end

你可以这样使用它:

ruby find-commit.rb SHA master

也就是说,总结一下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。

git log --topo-order

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

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

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

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

您的示例显示分支特性仍然可用。

在这种情况下,h是最后的结果:

git log master ^feature --ancestry-path

如果分支特性不再可用,你可以在c和master之间的历史行中显示合并提交:

git log <SHA-1_for_c>..master --ancestry-path --merges

然而,这也将显示所有发生在h之后的合并,以及在e和g之间的特征。


比较以下命令的结果:

git rev-list <SHA-1_for_c>..master --ancestry-path

git rev-list <SHA-1_for_c>..master --first-parent

会得到h的SHA-1作为最后一行。

如果有可用的,可以在这些结果上使用comm -1 -2。如果你在msysgit上,你可以使用下面的perl代码进行比较:

perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/'  file1 file2

(perl代码来自http://www.cyberciti.biz/faq/command-to-display-lines-common-in-files/,这是从“comp.com .unix.shell新闻组的某人”)。

如果要使其成为一行程序,请参阅流程替换。