如何找到两个Git分支的最近公共祖先?
如何找到两个Git分支的最近公共祖先?
您需要使用git merge-base
。用法:
$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
git log master...HEAD
。 翻译:@funroll提到,也可以使用简写方式git log master...HEAD
来实现相同的功能。 - CB Bailey--octopus
标志才能获得正确的结果。显而易见但是错误的 git merge-base branch1 branch2 branch3
会给出一个提交记录,但是根据文档中的讨论部分所描述的,这个提交不一定是所有三个分支的共同祖先。 - Mark Amerygit 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 diff origin/branchname...
。 - Mark Chgit diff branchA..branchB
和 git diff branchA...branchB
有什么区别呢? - Bharat Pahalwani如之前的回答所述,尽管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 version 2.14.1.windows.1
。使用一个分支(带有自己的提交)运行 git merge-base --fork-point branch2
,而我知道该分支已经从当前分支分叉,但是没有任何结果,然而 git merge-base branch1 branch2
正确显示了分叉点。可能出了什么问题? - ADTCbranch2
,然后运行 git merge-base --fork-point branch1
。 - Asclepiusgit merge-base branch1 branch2
结果匹配的共同祖先。但奇怪的是,--fork-point
无论如何都没有给出任何结果。你确认它对你有用吗? - ADTC使用 gitk
可以以图形方式查看两个分支:
gitk branch1 branch2
然后就容易在这两个分支的历史记录中找到共同祖先。
找到所有分支的共同祖先
git merge-base $(git branch --format "%(refname)")
git checkout myRep
git pull origin main --allow-unrelated-histories
git push origin myRep