ChatGPT解决这个技术问题 Extra ChatGPT

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

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

定义最近的:真实世界时间、提交次数、其他指标?
相关(交叉合并):stackoverflow.com/questions/26370185/…
@YakovL 我相信不会,因为分支并且您可以在提交对象上设置任意提交日期:该日期本身可能不是您想要的。
@CiroSantilli新疆改造中心996ICU六四事件在我看来,只有在树中的最后一个常见提交之前有一个具有较旧时间戳的提交时才会有所不同。你能提供一个不那么琐碎的例子吗?

M
Mark Amery

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

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

请注意,这会找到最近的共同祖先......我相信这是提问者想要的,所以 +1。请注意,以防有人来到这里试图找到最古老的共同祖先(就像我所做的那样)——另请参阅:stackoverflow.com/questions/1527234/…
@funroll:或者它的简写:git log master...HEAD
@lindes 最古老的共同祖先不是最初的提交吗?
@ThorbjørnRavnAndersen,是的,我想是这样的......描述的困难来自于git使用有向无环图的事实,但它通常被认为是一棵树,从技术上讲它不是。为了在我的措辞上更加小心,我在谈论您希望“分支”的第一个实例的父级发散的情况......因为它们可能有多个重新合并和重新拆分的点,这是其中“最古老的”,但不是真正最古老的祖先,(我认为)始终是最初的提交。
虽然这个问题严格来说是关于找到 两个 分支的共同祖先,但任何想要 三个 或更多分支的共同祖先的人都应该注意他们需要传递 --octopus 标志得到正确的结果。明显但错误的 git merge-base branch1 branch2 branch3 会给您一个提交,但是,如文档中的讨论部分所述,它不一定是所有三个分支的共同祖先。
C
Ciro Santilli Путлер Капут 六四事

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 的特殊情况下
“...”在 powershell 中对我不起作用,有趣的是它在 git 控制台中起作用,也许 repo 不完整, git diff $(git merge-base AB) B 做到了,因为我对 git 有点陌生我有点怀疑这可能会合并分支:)
哇。相当惊人。如果您想要的分支在您的本地存储库中不存在,因为您从未检查过它,您可以简单地执行 git diff origin/branchname...
那么 git diff branchA..branchBgit diff branchA...branchB 和有什么区别?
@BharatPahalwani,在我阅读了您的评论后,如果在谷歌上搜索,发现这个是第三个。 matthew-brett.github.io/pydagogue/git_diff_dots.html 在评论中提出这个问题之前,您尝试过什么?
A
Asclepius

如先前的答案所述,尽管 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 正确显示叉点。可能是什么问题呢?
@ADTC Checkout branch2,然后运行 git merge-base --fork-point branch1
@ADTC 使用图形提交查看器,例如 gitk 等来查看树的样子。也许你会得到你的答案。
当我以图形方式查看这棵树时,我没有看到任何奇怪的地方。我可以跟踪路径并找到与 git merge-base branch1 branch2 的结果匹配的共同祖先。但奇怪的是 --fork-point 没有给出任何一种方式。您是否确认它按预期为您工作?
我和@ADTC 一样。命令 'git log -1 $(git merge-base --fork-point anotherBranch)' 使用 git 版本 2.16.2.windows.1 没有显示任何结果。
M
Martin G

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

gitk branch1 branch2

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


并非所有事情都可以在每种情况下以视觉方式完成。事情可能需要以编程方式自动化是有原因的。