当您解决冲突,然后进行更改,然后执行 git diff 时,它会显示两列 + 和 -,一列用于“我们的”,另一列用于“他们的”。鉴于 repo 的 git 历史记录中的合并提交,我如何查看由其他人完成的解决方案?在其他情况下,我以前见过它(我认为是在 gitk 中),但我似乎无法为我拥有的这个 SHA1 确定它。
3 回答
如果您知道 ref,那么git show <MERGE_COMMIT>
将向您显示合并提交的解决方案(如果有)。
对于日志,使用git log -p -c
或git log -p --cc
。从 git log 的手册页:
-c
With this option, diff output for a merge commit shows the differences from each
of the parents to the merge result simultaneously instead of showing pairwise
diff between a parent and the result one at a time. Furthermore, it lists only
files which were modified from all parents.
--cc
This flag implies the -c option and further compresses the patch output by
omitting uninteresting hunks whose contents in the parents have only two
variants and the merge result picks one of them without modification.
最近(2022 年,九年后)的选项是:
git log --remerge-diff
在 Git 2.36(2022 年第二季度)中,“ git log --remerge-diff
” (man)显示了与机械合并结果和实际记录在合并提交中的结果的差异。
请参阅Elijah Newren ( )提交的 0dec322、提交 0d83d82 、提交20323d1、提交95433ee、提交 6054d1a、提交 a28d094、提交 24dbdab、提交 35f6967、提交 7b90ab4、提交 db757e8(2022 年 2 月 2 日)。
请参阅Junio C Hamano ( ) 的提交 5046831(2021 年 12 月 21 日)。(由Junio C Hamano 合并 -- --在提交 90b7153中,2022 年 2 月 16 日)newren
gitster
gitster
show, log
: 提供 --remerge-diff 能力签字人:以利亚·纽伦
当指定此选项时,我们重新合并所有(两个父级)合并提交并将实际合并提交与自动创建的版本进行比较,以显示用户如何:
- 删除了冲突标记,
- 解决了不同的冲突版本,并且
- 可能会在冲突区域之外添加新的更改**,以解决语义合并问题(或者,可能只是为了隐藏其他随机更改)。
此功能通过创建临时对象目录并将其标记为主要对象存储来工作。
这使得在自动合并期间创建的任何 blob 或树都可以通过从临时对象目录中删除所有对象来轻松删除。此实现有几种方式不是最理想的:
log --remerge-diff
变得很慢,因为临时对象目录在运行时会充满许多松散的对象- 日志输出可能会因错误的“警告:无法合并二进制文件”消息而变得混乱,因为
ll-merge.c
在运行时无条件地将这些消息写入标准错误,而不是允许调用者管理它们。- 简单地丢弃重要的冲突和警告消息;因此,对于无法用内容冲突标记表示的修改/删除或重命名/重命名或文件/目录等冲突,用户可能无法
--remerge-diff
知道存在已解决的冲突(并且可能激发了其他合并提交中的更改)。- 修复上一个问题时,请注意可能会开始包含一些不重要的冲突和警告消息。
相反,我们应该确保这些仍然被丢弃。
后续提交将解决这些问题。
diff-options
现在在其手册页中包含:
--diff-merges=(off|none|on|first-parent|1|separate|m|combined|c|dense-combined|cc|remerge|r)
diff-options
现在在其手册页中包含:
--diff-merges=remerge:
--diff-merges=r:
--remerge-diff:
使用此选项,双父合并提交被重新合并以创建一个临时树对象——可能包含带有冲突标记等的文件。
然后在该临时树和实际合并提交之间显示差异。
使用此选项时发出的输出可能会发生变化,它与其他选项的交互也会发生变化(除非明确记录)。
轻微的自行车棚:您可以使用 diff3 或 kdiff3 反向查看合并,特别是如果它是(git 风格)“邪恶”合并,其中引入了二次更改来解决冲突。(当心一个爆炸的脑袋,试图看看它是如何“退出”这些变化的;-)
显然,“基础”提交将是合并提交。