git rerere 如何找出两个冲突之间的相似之处



好的,我的Q来了。"git rerere"是否比较两个文件的哈希值以找出分辨率?也就是说,假设我有一个包含此标记的 XML 文件:

<number>12</number>

当我发生冲突时,该数字通常会更改为 13、14 等,所以我坚持:

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

即使数字与上次不同,rerere是否可以自动解决此冲突?我总是希望它以这样的方式解决它,它需要更高的数字(在上面的例子中,13)。因此,如果它记录数字 12 和 13 的分辨率,它会解决与不同数字的冲突吗?我怀疑它不会,但不妨问一下。

即使数字与上次不同,rerere是否可以自动解决此冲突?我总是希望它以这样的方式解决它,它需要更高的数字(在上面的例子中,13)。

不,git rerere做不到。

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

  • 一个特定的冲突(即,处于冲突中的大块头的文字文本和它们所在的文件);和
  • 应对该冲突适用的决议

因为这些是大块字面(例如"用 13 替换 12")而不是某种转换函数(例如"用 N + 1 替换 N"),git 无法推断你想用更高的数字替换每个数字。

如果 git 后来遇到与其之前记住的任何冲突都不匹配的冲突,就好像它根本没有遇到过该冲突一样,即使它可能相似(如您的示例中,数字始终是一次性的)。

如果自动生成此 XML 文件,则可能有一种出路。在这种情况下,您可能需要考虑根本不将其保留在源代码管理中,而是在运行时生成它。这样,您将永远不会有相应的冲突需要清理。

另一种方法是完全避免git rerere,而是编写一个自定义合并驱动程序来为您解决问题。我以前做过这个,但这是一个不平凡的工作量,它需要你编写和测试一些代码。如果您对这种策略感兴趣,请参阅卡尔答案中的链接。

Vanilla git 不会以这种方式比较文件。 它执行严格的字符串比较,并且对它的语义一无所知。

但是,请查看 gitattributes 手册页中的"定义自定义合并驱动程序"。 它允许您编写自己的程序,以任何您想要的方式解析某些合并,包括选择较大的数字。

最新更新