如果git可以弄清楚如何合并垂直(线)变化,为什么水平(字符)不会改变?

时间:2016-08-16 23:33:05

标签: git merge

如果提交Apple在第1行放置'a'并且在第3行提交Banana put'b',git可以将这些提交合并在一起没有问题,但是如果'a'在第1行的开头并且'b'最后是9个字符,它会窒息,不知道如何合并它们,你必须手动完成。

为什么不能解决这个问题?

即使编辑相同的行如下:

original commit:       <question1 states="AZ,OH">
commit Orange line 25: <question1 states="AZ,IN,OH">
commit Pear line 25:   <question1 states="AZ,OH,TX">

Git合并无法弄清楚在OH之后加上 IN TX 之后,但作为一个人我可以很容易地看到如何做到这一点,而且我已经使用了比较编辑器(如KDiff3),它为我指出了哪些确切的字符发生了变化(颜色编码),而git只显示了整行的变化。

KDiff3示例:KDiff3_merge_conflict

我只是不知道git是否认为Orange中的OH变为IN,OH或者是否过多处理以检查是否仅在OH之前添加了IN ...但也许有更好的合并工具可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

Git内置的合并算法使用Git的内置差异,这是面向行的。它真的那么简单:它看到两个差异,其中一个说&#34;用线B和#34替换A线;其中一个说&#34;用C线代替A线&#34;并且两个替换不同=&gt;冲突。

如果您提供自定义合并驱动程序,则可以运行自己的差异并进行自己的合并。尽管如此,它并不是微不足道的。在这种特殊情况下,两遍算法(首先,查找更改的行;第二,查看更改的行是否可以作为更改的字符处理)可能有效。