如何审查合并提交以检测不正确的大块头
How to review merge commits to detect incorrect hunks
通常在审查合并提交时,我们会 git diff-tree --cc <commit>
(或简称 git show <commit>
),但我遇到了以下问题:
假设您将 B
合并到 A
中,并且在冲突解决期间您需要从 A
或 B
分支中选择一个 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^1
或 HEAD~1
或 HEAD^
或 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
,虽然它在这里没有帮助。
通常在审查合并提交时,我们会 git diff-tree --cc <commit>
(或简称 git show <commit>
),但我遇到了以下问题:
假设您将 B
合并到 A
中,并且在冲突解决期间您需要从 A
或 B
分支中选择一个 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^1
或 HEAD~1
或 HEAD^
或 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
,虽然它在这里没有帮助。