为什么合并显示补丁中没有变化?

时间:2016-10-14 13:14:26

标签: git

我正在梳理git repo的日志,我发现注释中列出了冲突的合并提交,但实际上没有文件作为合并提交的一部分而更改。这怎么会发生?合并有两个父项,它们肯定是不同的,那么如何在补丁中列出文件更改?

1 个答案:

答案 0 :(得分:2)

默认情况下,合并提交中的git show(具有两个或更多父项的提交)显示“组合差异”。 documentation for git show隐藏了这个关键段落:

  

请注意,组合差异仅列出从所有父级修改过的文件。

也就是说,假设合并3333333...包含父级1111111...2222222...,并且:

git diff 1111111 3333333

会显示对READMEfile1.txt的更改,并且:

git diff 2222222 3333333

会显示对READMEfile2.txt的更改。进一步假设README中的更改不同,以便合并必须组合这两个更改。然后:

git show 3333333

会显示README(因为3333333:README1111111:README 2222222:README不同,但不会向您显示file1.txtfile2.txt(因为333333311111112222222中的相同)。

在这种情况下(具有冲突的文件),这意味着通过仅选择每个文件的多个父项版本之一来解决冲突,而不是组合来自每个父项的更改。 (这通常是一个错误。)

使用git log -p时更糟糕的是,对于合并提交,默认情况下完全跳过差异列表。

您可以修改任何diff-showing命令(包括git log -p)向您显示合并with any of -c, --cc, or -m的方式。 (--cc选项是git show的默认选项。请注意,-前面有两个cc个字符,c前面只有一个m和{ {1}}。)但是,只有-m实际上显示所有差异,通过(实际上)将提交分成多个虚拟提交,每个提交一个 N 父母。