如何找到两个 Git 分支的最近共同祖先?
git diff master...feature
显示当前(可能是多次提交)功能分支的所有新提交。
man git-diff
证明:
git diff A...B
是相同的:
git diff $(git merge-base A B) B
但 ...
更容易输入和记住。
正如提到的 by Dave,可以省略 HEAD
的特殊情况。所以:
git diff master...HEAD
是相同的:
git diff master...
如果当前分支是 feature
,这就足够了。
最后,记住顺序很重要!执行 git diff feature...master
将显示在 master
而不是在 feature
上的更改。
我希望更多的 git 命令支持这种语法,但我不认为他们支持。有些甚至对 ...
有不同的语义:What are the differences between double-dot ".." and triple-dot "..." in Git commit ranges?
git diff master...
在差异到 HEAD
的特殊情况下
git diff origin/branchname...
git diff branchA..branchB
和 git diff branchA...branchB
和有什么区别?
如先前的答案所述,尽管 git merge-base
有效,
$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
如果 myfeature
是当前分支,通常情况下,您可以使用 --fork-point
:
$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
这个论点只适用于足够新的 git 版本。不幸的是,它并不总是有效,而且还不清楚为什么。请参阅 this answer 末尾注明的限制。
有关完整的提交信息,请考虑:
$ git log -1 $(git merge-base --fork-point develop)
git version 2.14.1.windows.1
。使用 我知道 从当前分支派生的分支 (带有自己的提交) 运行 git merge-base --fork-point branch2
不会产生任何结果,而 git merge-base branch1 branch2
正确显示叉点。可能是什么问题呢?
branch2
,然后运行 git merge-base --fork-point branch1
。
gitk
等来查看树的样子。也许你会得到你的答案。
git merge-base branch1 branch2
的结果匹配的共同祖先。但奇怪的是 --fork-point
没有给出任何一种方式。您是否确认它按预期为您工作?
使用 gitk
,您可以以图形方式查看这两个分支:
gitk branch1 branch2
然后很容易在两个分支的历史上找到共同的祖先。
不定期副业成功案例分享
git log master...HEAD
--octopus
标志得到正确的结果。明显但错误的git merge-base branch1 branch2 branch3
会给您一个提交,但是,如文档中的讨论部分所述,它不一定是所有三个分支的共同祖先。