git:我如何找到两个分支的共同祖先......已经合并
git: how do I find the common ancestor of two branches... that have already been merged
为了找到 2 个 git 分支的共同祖先,需要做的是:
git merge-base branch another_branch
好的。但是……如果两个分支都已经合并了怎么办?当我在这种情况下使用 merge-base
时,我得到的提交是合并前的最新提交,我想知道两个分支来自的共同祖先 "before the merge".
换句话说:
Z - A - B - C - D - E - F
\ /
G - H - I
HEAD
在F。如果我在这里做git merge-base
,我得到的提交是I
,我要找的是A,或者可能是Z。有没有git指令可以找到它?
如果你这样做
git merge-base C I
你得到了你想要的提交 A。 C和我是什么?它们是您的合并提交 D 的父提交。
嘿,你明白了吗?
git log --pretty=%P -n 1 D
给你两个字符串。这两个字符串是你需要的提交 C 和 I。
如果你想一起做,你可以写
git merge-base $(git log --pretty=%P -n 1 MERGE_COMMIT)
你必须用合并提交 D
的散列替换 MERGE_COMMIT
编辑:
正如@poke 所说,
更简单
git merge-base MERGE_COMMIT^ MERGE_COMMIT^2
我通常需要在我的分支 HEAD
和远程主要开发分支 origin/dev
之间找到祖先。这是我使用的:
git log --reverse --boundary --format=%h HEAD ^origin/dev | head -1
它本质上说:
- 取除与
origin/dev
共同的祖先以外的所有祖先
- 包括边界(分叉点)
- 颠倒顺序,使分叉点成为列表中的第一个
- 记录到只有
SHA
出现的格式
- 取此列表中的第一个
为了找到 2 个 git 分支的共同祖先,需要做的是:
git merge-base branch another_branch
好的。但是……如果两个分支都已经合并了怎么办?当我在这种情况下使用 merge-base
时,我得到的提交是合并前的最新提交,我想知道两个分支来自的共同祖先 "before the merge".
换句话说:
Z - A - B - C - D - E - F
\ /
G - H - I
HEAD
在F。如果我在这里做git merge-base
,我得到的提交是I
,我要找的是A,或者可能是Z。有没有git指令可以找到它?
如果你这样做
git merge-base C I
你得到了你想要的提交 A。 C和我是什么?它们是您的合并提交 D 的父提交。
嘿,你明白了吗?
git log --pretty=%P -n 1 D
给你两个字符串。这两个字符串是你需要的提交 C 和 I。
如果你想一起做,你可以写
git merge-base $(git log --pretty=%P -n 1 MERGE_COMMIT)
你必须用合并提交 D
的散列替换 MERGE_COMMIT编辑: 正如@poke 所说,
更简单git merge-base MERGE_COMMIT^ MERGE_COMMIT^2
我通常需要在我的分支 HEAD
和远程主要开发分支 origin/dev
之间找到祖先。这是我使用的:
git log --reverse --boundary --format=%h HEAD ^origin/dev | head -1
它本质上说:
- 取除与
origin/dev
共同的祖先以外的所有祖先
- 包括边界(分叉点)
- 颠倒顺序,使分叉点成为列表中的第一个
- 记录到只有
SHA
出现的格式 - 取此列表中的第一个