想象一下下面的历史:
c---e---g--- feature
/ \
-a---b---d---f---h--- master
我怎么能找到当提交“c”已合并到主(即,找到合并提交“h”)?
想象一下下面的历史:
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
其他回答
我使用下面的bash脚本,我放置在路径~/bin/git-find-merge。它基于Gauthier的答案和evilstreak的答案,并在处理极端情况时做了一些调整。当输入未排序时,Comm抛出。Grep -f工作得很完美。
角情况下:
如果commit是分支的第一个父路径上的合并提交,则返回commit。 如果commit在分支的第一个父路径上是非合并提交,则返回分支。要么是ff merge,要么是只在分支上提交没有办法确定正确的提交。 如果commit和branch相同,则返回commit。
~ / bin / git-find-merge脚本:
#!/bin/bash
commit=$1
if [ -z $commit ]; then
echo 1>&2 "fatal: commit is required"
exit 1
fi
commit=$(git rev-parse $commit)
branch=${2-@}
# if branch points to commit (both are same), then return commit
if [ $commit == $(git rev-parse $branch) ]; then
git log -1 $commit
exit
fi
# if commit is a merge commit on first-parent path of branch,
# then return commit
# if commit is a NON-merge commit on first-parent path of branch,
# then return branch as it's either a ff merge or commit is only on branch
# and there is not a good way to figure out the right commit
if [[ $(git log --first-parent --pretty='%P' $commit..$branch | \
cut -d' ' -f1 | \
grep $commit | wc -l) -eq 1 ]]; then
if [ $(git show -s --format="%P" $commit | wc -w) -gt 1 ]; then
# if commit is a merge commit
git log -1 $commit
else
# if commit is a NON-merge commit
echo 1>&2 ""
echo 1>&2 "error: returning the branch commit (ff merge or commit only on branch)"
echo 1>&2 ""
git log -1 $branch
fi
exit
fi
# 1st common commit from bottom of first-parent and ancestry-path
merge=$(grep -f \
<(git rev-list --first-parent $commit..$branch) \
<(git rev-list --ancestry-path $commit..$branch) \
| tail -1)
if [ ! -z $merge ]; then
git log -1 $merge
exit
fi
# merge commit not found
echo 1>&2 "fatal: no merge commit found"
exit 1
这让我可以这样做:
(master)
$ git find-merge <commit> # to find when commit merged to current branch
$ git find-merge <branch> # to find when branch merged to current branch
$ git find-merge <commit> pu # to find when commit merged to pu branch
这个脚本也可以在我的github。
我不得不这样做了好几次(感谢每个回答这个问题的人!),最后写了一个脚本(使用Gauthier的方法),可以将它添加到我的git实用程序的小集合中。你可以在这里找到它:https://github.com/mwoehlke/git-utils/blob/master/bin/git-merge-point。
基于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
}
我的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
对于Ruby人群来说,有git- where。非常容易。
$ gem install git-whence
$ git whence 1234567
234557 Merge pull request #203 from branch/pathway