我正在梳理git repo的日志,我发现注释中列出了冲突的合并提交,但实际上没有文件作为合并提交的一部分而更改。这怎么会发生?合并有两个父项,它们肯定是不同的,那么如何在补丁中列出文件更改?
答案 0 :(得分:2)
默认情况下,合并提交中的git show
(具有两个或更多父项的提交)显示“组合差异”。 documentation for git show
隐藏了这个关键段落:
请注意,组合差异仅列出从所有父级修改过的文件。
也就是说,假设合并3333333...
包含父级1111111...
和2222222...
,并且:
git diff 1111111 3333333
会显示对README
和file1.txt
的更改,并且:
git diff 2222222 3333333
会显示对README
和file2.txt
的更改。进一步假设README
中的更改不同,以便合并必须组合这两个更改。然后:
git show 3333333
会显示README
(因为3333333:README
与1111111:README
和 2222222:README
不同,但不会向您显示file1.txt
或file2.txt
(因为3333333
与1111111
或2222222
中的相同)。
在这种情况下(具有冲突的文件),这意味着通过仅选择每个文件的多个父项版本之一来解决冲突,而不是组合来自每个父项的更改。 (这通常是一个错误。)
使用git log -p
时更糟糕的是,对于合并提交,默认情况下完全跳过差异列表。
您可以修改任何diff-showing命令(包括git log -p
)向您显示合并with any of -c
, --cc
, or -m
的方式。 (--cc
选项是git show
的默认选项。请注意,-
前面有两个cc
个字符,c
前面只有一个m
和{ {1}}。)但是,只有-m
实际上显示所有差异,通过(实际上)将提交分成多个虚拟提交,每个提交一个 N 父母。