Git:查找两个分支机构的最新共同祖先

如何找到两个 Git 分支的最新共同祖先?

答案

您正在寻找git merge-base 。用法:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

git diff master...feature

显示当前(可能是多次提交)功能分支的所有新提交。

man git-diff文件指出:

git diff A...B

是相同的:

git diff $(git merge-base A B) B

但是...更易于键入和记忆。

Dave所述, HEAD的特殊情况可以省略。所以:

git diff master...HEAD

是相同的:

git diff master...

如果当前分支是feature ,这就足够了。

最后,请记住顺序很重要!进行git diff feature...master将显示master上的更改,而不是feature上的更改。

我希望更多的 git 命令支持该语法,但我认为它们不支持。并且有些甚至对...具有不同的语义: 在 Git 提交范围中,双点 “..” 和三点 “...” 之间有什么区别?

如先前的回答所述, git merge-base工作原理是:

$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

但是,如果myfeature是当前分支(通常),则可以使用 use --fork-point

$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

此参数仅在最新版本的 git 中有效。不幸的是,它并不总是有效,并且不清楚原因。请参阅此答案结尾处指出的限制。


有关完整的提交信息,请考虑:

$ git log -1 $(git merge-base --fork-point develop)

使用gitk您可以以图形方式查看两个分支:

gitk branch1 branch2

然后很容易在两个分支的历史中找到共同的祖先。