37

当您解决冲突,然后进行更改,然后执行 git diff 时,它会显示两列 + 和 -,一列用于“我们的”,另一列用于“他们的”。鉴于 repo 的 git 历史记录中的合并提交,我如何查看由其他人完成的解决方案?在其他情况下,我以前见过它(我认为是在 gitk 中),但我似乎无法为我拥有的这个 SHA1 确定它。

4

3 回答 3

54

如果您知道 ref,那么git show <MERGE_COMMIT>将向您显示合并提交的解决方案(如果有)。

对于日志,使用git log -p -cgit 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.
于 2013-10-29T10:30:48.970 回答
4

最近(2022 年,九年后)的选项是:

git log --remerge-diff

在 Git 2.36(2022 年第二季度)中,“ git log --remerge-diffman显示了与机械合并结果和实际记录在合并提交中的结果的差异。

请参阅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:

使用此选项,双父合并提交被重新合并以创建一个临时树对象——可能包含带有冲突标记等的文件。

然后在该临时树和实际合并提交之间显示差异。

使用此选项时发出的输出可能会发生变化,它与其他选项的交互也会发生变化(除非明确记录)。

于 2022-02-19T00:30:13.393 回答
0

轻微的自行车棚:您可以使用 diff3 或 kdiff3 反向查看合并,特别是如果它是(git 风格)“邪恶”合并,其中引入了二次更改来解决冲突。(当心一个爆炸的脑袋,试图看看它是如何“退出”这些变化的;-)

显然,“基础”提交将是合并提交。

于 2013-03-07T17:54:38.670 回答