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

时间:2012-04-18 22:20:17

标签: xml git merge conflict git-rerere

好的,这就是我的问题。“git rerere”比较两个文件的哈希来计算分辨率吗?也就是说,我有一个包含此标记的XML文件:

<number>12</number>

当我发生冲突时,这个数字通常会变成13,14等,所以我坚持:

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

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

2 个答案:

答案 0 :(得分:7)

  

即使数字与上次不一样,还是可以重新自动解决此冲突吗?我总是希望它能够以更高的数字(例如上面的例子,13)来解决它。

不,git rerere不能这样做。

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

  • 一个特定的冲突(即冲突中的帅哥的文字和他们所处的文件);和
  • 应该应用于该冲突的决议

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

如果git后来遇到的冲突与之前记忆的任何冲突都不匹配,那就好像从来没有遇到任何冲突,即使它可能是相似的(如你的例子中数字总是一个)关)。

如果自动生成此XML文件,则可以实现一种方法。在这种情况下,您可能想要考虑根本不将它保留在源代码控制中,而是在运行时生成它。那么你永远不会有相应的冲突来清理。

另一种方法是完全避免git rerere,而是编写一个自定义合并驱动程序,它将为您解决问题。我以前做过这个,但这是一项非常重要的工作,它要求你编写和测试一些代码。如果您对此策略感兴趣,请参阅the link中的Karl's answer

答案 1 :(得分:2)

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

但是,请查看gitattributes man page中的“定义自定义合并驱动程序”。它允许您编写自己的程序,以任何方式解决某些合并,包括选择更高的数字。