如何审查合并提交以检测不正确的大块头

How to review merge commits to detect incorrect hunks

通常在审查合并提交时,我们会 git diff-tree --cc <commit>(或简称 git show <commit>),但我遇到了以下问题:

假设您将 B 合并到 A 中,并且在冲突解决期间您需要从 AB 分支中选择一个 hunk 来解决它。假设 A 中的大块头出于某种原因取代了 B 中的大块头,但由于您可能不知道它并仅通过例如判断。提交日期,您从 B 分支中选择 hunk。

如果您除此之外不做任何其他修改,通过 git show 的多父差异将不会显示任何差异输出,因为生成的块完整地包含在其中一个父提交中。

进一步说明,如果您有此冲突:

<<<<<<< HEAD
aaa
=======
bbb
>>>>>>> b

然后删除 aaa hunk 并选择 bbb,反之亦然,git show <merge_commit> 根本不会显示任何内容,因此您无法看到选择了哪个 hunk合并。

这可能会导致很难找到回归线。

我如何才能看到在冲突解决过程中选择了哪些帅哥?

编辑:我要做的是只查看有冲突的帅哥(因此不会自动合并)。

将合并与特定 parent(甚至所有 parent)进行区分。

通常要比较的 parent 是 first-parent,即 HEAD^1HEAD~1HEAD^HEAD~(所有意思一样)。要与第二个parent比较,选择HEAD^2(第二个parent没有其他简写方式:必须使用帽子后缀和数字)。

如果合并不是当前 (HEAD) 提交,请将 HEAD 替换为合并提交 ID。

要查看与 all parent 的差异,您可以简单地 git show -m <commit>,其中(仅限内部)"splits" 合并以便而不是那个提交 combined-diff-ed,它是 diff-ed 一个 parent 一次针对每个 parent.

因此:

git show -m <commit>

(当你看够了就停下来,或者如果你愿意,可以一直玩到最后)或者:

git diff <commit>^ <commit>

Edit: what I'm after is to view just the hunks that were conflicted (thus not auto-merged).

不是您要找的答案:git 命令无法做到这一点。 git 不会跟踪合并是如何以任何方式或方式解决的(git rerere 缓存除外,尽管它在这里对我们没有帮助)。您将需要类似“4 向差异”(A、B、公共父级和合并结果)之类的东西,这是我从未听说过的。

理论上,您可以回去自己编写一个程序,重新执行原始的 3 路合并以生成中间文件(带有冲突标记)和 diff that 到合并结果。 git 没有为您执行此操作的规定。

编辑:提到了git rerere,虽然它在这里没有帮助。