Git:查找两个分支最近的共同祖先

问题描述 投票:0回答:6

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

git git-branch
6个回答
1481
投票

您正在寻找

git merge-base
。用途:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

80
投票

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 提交范围中双点“..”和三点“...”有什么区别?


53
投票

正如之前的答案所述,虽然

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) 

14
投票

使用

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

gitk branch1 branch2

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


0
投票

找到所有分支的共同祖先

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

-1
投票
git checkout myRep
git pull origin main --allow-unrelated-histories
git push origin myRep
© www.soinside.com 2019 - 2024. All rights reserved.