Git rerere如何确定两个冲突之间的相似性?

5

好的,我来回答你的问题。 "git rerere" 是通过比较两个文件的哈希值来确定解决方案的吗?也就是说,假设我有一个包含以下标记的 XML 文件:

<number>12</number>

当我遇到冲突时,那个数字通常会变成13、14等,所以我被困在这样的情况下:

<<<<<<<
<number>12</number>
=======
<number>13</number>
>>>>>>>

即使数字与上次不同,rerere能否自动解决冲突?我希望它总是以更高的数字(如上面的例子中的13)来解决冲突。如果它记录了12和13的分辨率,它会解决具有不同数字的冲突吗?我怀疑它不会,但还是问一下。

2个回答

7

即使数字与上次不同,rerere能自动解决这个冲突吗?我希望它总是以较高的数字(例如以上示例中的13)来解决它。

不,git rerere 无法做到这一点。

当您使用 git rerere 时,您要求它记住两件事:

  • 一个特定的冲突(即在冲突中存在的hunk文字和它们所在的文件);以及
  • 应该应用于该冲突的解决方案

因为这些是 hunk 的文字(例如“将12替换为13”)而不是某种转换函数(例如“将N替换为N + 1”),所以 git 无法推断出您想要用更高的数字替换每个数字。

如果 git 后来遇到了与其先前记住的任何冲突都不匹配的冲突,则就像从未遇到过该冲突一样,即使它可能类似(如您的示例中数字总是相差一位)。

一种可能的解决方法是,如果此 XML 文件是自动生成的,则可以考虑根本不将其保留在源代码控制中,而是在运行时生成它。然后,您将永远不需要清理相应的冲突。

另一种方法是完全避免使用 git rerere,而是编写一个自定义合并驱动程序来为您解决问题。我以前做过这个,但这需要您编写和测试一些代码,因此需要花费相当多的工作量。如果您对此策略感兴趣,请参见 链接 中的 Karl's answer


啊,我就是这么想的。感谢您提供详细的答案。不幸的是,这些数字总是由人输入的,所以看来我得研究一下那个自定义合并驱动程序了。感谢您和卡尔的提示。 - mart1n

2
香草Git并不以那种方式比较文件。它进行严格的字符串比较,不知道任何有关其语义的信息。
但是,请查看“定义自定义合并驱动程序”中gitattributes手册页面。它允许您编写自己的程序以任何您想要的方式解决某些合并,包括选择更高的数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接