在另一个问题的 cmets 中指出了一个项目,现在重定向到这里 (How to setup git merge / git pull for xml files?)。从逻辑上讲,这也应该是一个注释,但它确实需要格式。所以,这里是一个答案,这个主题:
将merge.conflictStyle 设置为diff3 会有所帮助
在做:
git config --global merge.conflictStyle diff3
(如果您只希望它用于一个存储库,或者没有--global,但我更喜欢--global 我自己)可以使工作树副本更有用。请注意,如果您正在编写合并驱动程序,则不会将工作树副本作为输入。相反,您将获得三个文件,oursbase 和 theirs,作为您的三个输入。如果您不尝试编写自己的合并驱动程序(而且编写自己的合并驱动程序很棘手:如果它很容易,XML 合并早就解决了),这主要是有用的。 p>
示例
以下是其他帖子的示例输入:
$ cat base
<li>
<span>BA</span>
</li>
$ cat ours
<li>
<span>BA</span>
</li>
<li>
<span>CE</span>
</li>
$ cat theirs
<li>
<span>BA</span>
</li>
<li>
<span>DF</span>
</li>
我们现在可以看到 Git 将如何合并这些文件,使用 git merge-file,它相当于来自 git merge 的一个低级(文件级)操作的命令行:
$ cp ours current
$ git merge-file current base theirs
$ cat current
<li>
<span>BA</span>
</li>
<li>
<<<<<<< curr
<span>CE</span>
=======
<span>DF</span>
>>>>>>> theirs
</li>
在这里,如您所见,Git 指出 ours(复制到 current)中的更改与 theirs 中的更改相冲突,与 base 相比。然而,冲突的某些部分很容易解决,所以 Git 这样做了,并且只标记了冲突的剩余部分。
但是,当我们请求 diff3 样式合并时,我们会得到:
$ cp ours current
$ git merge --diff3 current base theirs
$ cat current
<li>
<span>BA</span>
</li>
<<<<<<< curr
<li>
<span>CE</span>
</li>
||||||| base
=======
<li>
<span>DF</span>
</li>
>>>>>>> theirs
有两个不同。 Git 不仅添加了||||||| base 部分——在这种情况下,它是空的;合并基本输入中没有行,但它也停止对ours/current 中的更改与theirs 中的更改进行部分解析。
(这是必要的,因为 Git 现在必须显示“我们的 vs 基地”和“他们的 vs 基地”,而不仅仅是“我们的 vs 他们的,尽最大努力”。)