想象一下下面的历史:
c---e---g--- feature
/ \
-a---b---d---f---h--- master
我怎么能找到当提交“c”已合并到主(即,找到合并提交“h”)?
想象一下下面的历史:
c---e---g--- feature
/ \
-a---b---d---f---h--- master
我怎么能找到当提交“c”已合并到主(即,找到合并提交“h”)?
当前回答
添加到~/.gitconfig:
[alias]
find-merge = "!sh -c 'commit=$0 && branch=${1:-HEAD} && (git rev-list $commit..$branch --ancestry-path | cat -n; git rev-list $commit..$branch --first-parent | cat -n) | sort -k2 -s | uniq -f1 -d | sort -n | tail -1 | cut -f2'"
show-merge = "!sh -c 'merge=$(git find-merge $0 $1) && [ -n \"$merge\" ] && git show $merge'"
然后你可以像这样使用别名:
# current branch
git find-merge <SHA-1>
# specify master
git find-merge <SHA-1> master
要查看合并提交的消息和其他细节,请使用带有相同参数的git show-merge。
(基于Gauthier的回答。感谢Rosen Matev和javabrett用sort纠正了一个问题。)
其他回答
我不得不这样做了好几次(感谢每个回答这个问题的人!),最后写了一个脚本(使用Gauthier的方法),可以将它添加到我的git实用程序的小集合中。你可以在这里找到它:https://github.com/mwoehlke/git-utils/blob/master/bin/git-merge-point。
也就是说,总结一下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。
图形化的解决方案是在gitk中找到它(使用“SHA1 ID”框),然后沿着提交行直到合并提交。
git log --topo-order
然后在提交之前寻找第一个合并。
这是在master中找到commit的最好方法:
[alias]
find-merge = !"f() { git rev-list $1..master --ancestry-path --merges --reverse | head -1; }; f"