git:如何查找已合并的两个分支的共同祖先?

6
为了找到两个git分支的共同祖先,需要执行以下操作:
git merge-base branch another_branch

好的。但是...如果两个分支已经被合并了怎么办?在这种情况下使用merge-base命令,我得到的提交是合并之前最新的那一个,而我想知道两个分支在“合并之前”来自哪一个共同的祖先。

换句话说:

Z - A - B - C - D - E - F
     \          /
      G - H - I 

HEAD 在 F 这个提交上。如果我在这个位置运行 git merge-base 命令,我得到的提交是 I,但是我需要找到的提交是 A 或者 Z。有没有什么 git 命令可以帮助我找到它们呢?

2个回答

4

如果您进行

git merge-base C I

您想获得您想要的提交A。那么C和I是什么?它们是合并提交D的父提交。
如何获得它们?
git log --pretty=%P -n 1 D 

这个指南会提供两个字符串,这两个字符串是你需要的提交 C 和 I。

如果你想一次性完成所有操作,可以这样写:

git merge-base $(git log --pretty=%P -n 1 MERGE_COMMIT)

您需要用您合并提交的哈希值来替换MERGE_COMMIT。

编辑: 正如@poke所述,使用以下方式更加简单:

git merge-base MERGE_COMMIT^ MERGE_COMMIT^2 

不好意思,您是不是指的是 git log --pretty=%P -n 1 D,而不是 git log --pretty=%P -n 1 A?(否则看起来有点循环...为了找到提交A,我需要首先输入一个涉及提交A的命令...) - PaulJ
您还可以使用 D^D^^ 引用合并提交 D 的两个父提交。因此,这样就变成了 git merge-base D^ D^^ - poke
@poke,我不这么认为。D^是其中一个父级,但D^^是D^的父级,而不是D的另一个父级。 - Manuel Schmidt
2
@ManuelSchmidt 对不起,你是对的。我是指 D^D^2 - poke
谢谢 @poke,我之前不知道这个。 - Manuel Schmidt

3

我通常需要找到我的分支顶部(HEAD)和远程主开发分支(origin/dev)之间的祖先。以下是我使用的方法:

git log --reverse --boundary --format=%h HEAD ^origin/dev | head -1

这段话基本上是说:

  • 取出除了与 origin/dev 共同的祖先以外的所有祖先
  • 包括边界(分叉点)
  • 反转顺序,使分叉点成为列表中的第一个
  • 将日志记录为仅包含 SHA 的格式
  • 从这个列表中取出第一个

很好,这个可以找到即使两个分支被多次合并(例如典型的git flow中的dev和master)的提交,这正是我所需要的。谢谢! - Kostrahb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接