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


当前回答

git checkout myRep
git pull origin main --allow-unrelated-histories
git push origin myRep

其他回答

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

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

Git差异控制…功能

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

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差异功能…Master将显示在Master上而不是在特性上的更改。

我希望更多的git命令能支持这种语法,但我不认为他们能做到。有些甚至对…有不同的语义。: Git的提交范围中,双点“..”和三点“…”有什么区别?

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

gitk branch1 branch2

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

正如之前的回答中所提到的,尽管git merge-base可以工作,

$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

如果myfeature是当前的分支,你可以使用——fork-point:

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

这个参数只在最新版本的git中有效。然而,不幸的是,这种方法并不总是有效,原因也不清楚。请参阅本答案末尾注明的限制。


对于完整的提交信息,请考虑:

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

找到所有分支的共同祖先

git merge-base $(git branch --format "%(refname)")