Git:找到两个分支的最新共同祖先

Ted*_*Ted 787 git

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

CB *_*ley 949

你在找git merge-base.用法:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这会找到最近的共同祖先......我认为这是提问者想要的,所以+1.只是注意到,如果有人来到这里试图找到*最老的*共同祖先(就像我做的那样) - 为此,另见:http://stackoverflow.com/questions/1527234/finding-a-branch-point -with-混帐 (82认同)
  • @lindes最古老的共同祖先不是最初的提交? (15认同)
  • @funroll:或者简写:`git log master ... HEAD` (13认同)
  • @ThorbjørnRavnAndersen,是的,我认为是这样......描述的难度来自git使用有向无环图这一事实,但它通常被认为是一棵树,技术上并非如此.为了更加小心我的措辞,我在谈论你希望"分支"的第一个实例的父亲发散的情况......因为他们可能有多个点重新合并并重新拆分,这是这些中最"古老的",但不是真正最古老的祖先,(我认为)始终是最初的提交. (7认同)
  • 这可能是他正在寻找的内容,但手册页并不能保证它是最新的,无论是实时还是提交次数:只是它是最好的共同祖先之一。 (2认同)
  • 我想我会经常使用这个小片段:`$(git merge-base HEAD master)`。例如,`git log $(git merge-base HEAD master)..HEAD` (2认同)
  • 虽然这个问题严格来说是关于找到两个分支的共同祖先,但是任何想要三个或更多个分支的共同祖先的人都应注意,他们需要传递--octopus标志来获得正确的结果。明显但错误的`git merge-base branch1 branch2 branch3`将给您提交,但是,正如文档的“讨论”部分所述,它*不一定*是所有三个分支的共同祖先。 (2认同)

Cir*_*四事件 36

git diff master...feature

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

man git-diff 文件:

git diff A...B
Run Code Online (Sandbox Code Playgroud)

是相同的:

git diff $(git merge-base A B) B
Run Code Online (Sandbox Code Playgroud)

但是...更容易打字和记忆.

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

git diff master...HEAD
Run Code Online (Sandbox Code Playgroud)

是相同的:

git diff master...
Run Code Online (Sandbox Code Playgroud)

如果当前分支是足够的feature.

最后,请记住订单很重要!执行git diff feature...master将显示master未打开的更改feature.

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

  • 或者只是`git diff master ...`在特殊情况下变为`HEAD` (6认同)
  • 那么 `git diffbranchA..branchB` 和 `git diffbranchA...branchB` 之间有什么区别? (2认同)

Acu*_*nus 23

如前面的答案中所述,git merge-base作品:

$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
Run Code Online (Sandbox Code Playgroud)

但如果myfeature是当前分支,通常情况下,您可以使用--fork-point:

$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
Run Code Online (Sandbox Code Playgroud)

这个论点只适用于最新版本的git.不幸的是,它并不总是有效,并且不清楚为什么.请参阅本答案末尾所述的限制.


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

$ git log -1 $(git merge-base --fork-point develop) 
Run Code Online (Sandbox Code Playgroud)

  • 我有“git 版本 2.14.1.windows.1”。使用**我知道**从当前分支分叉的分支_(具有自己的提交)_运行`git merge-base --fork-pointbranch2`不会产生任何结果,而`git merge-base branch1branch2`正确显示了分叉点。可能是什么问题呢? (2认同)

Mar*_*n G 11

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

gitk branch1 branch2
Run Code Online (Sandbox Code Playgroud)

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

  • 在所有情况下,并非一切都可以在视觉上完成 有些原因可能需要以编程方式自动化. (5认同)
  • 并非每个答案都必须涵盖所有可能的情况才有用 (3认同)