我在合并2个分支时遇到问题。我有一个包含以下内容的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<language xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="sk" xsi:noNamespaceSchemaLocation="language.xsd">
<topic name="topicName">
<section name="sectionName">
<pair key="key_1" state="0">value 1</pair>
<pair key="key_2" state="0">value 2</pair>
</section>
</topic>
</language>
然后是以下情况:
分支“master”在xml文件中只更改“状态”,从“0”变为“1”。即。
<?xml version="1.0" encoding="utf-8"?>
<language xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="sk" xsi:noNamespaceSchemaLocation="language.xsd">
<topic name="topicName">
<section name="sectionName">
<pair key="key_1" state="1">value 1</pair>
<pair key="key_2" state="1">value 2</pair>
</section>
</topic>
</language>
这些更改不会被提交并推送到te cenral存储库。
分支“测试”添加新节点。即:
<?xml version="1.0" encoding="utf-8"?>
<language xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="sk" xsi:noNamespaceSchemaLocation="language.xsd">
<topic name="topicName">
<section name="sectionName">
<pair key="key_1" state="0">value 1</pair>
<pair key="key_2" state="0">value 2</pair>
<pair key="key_3" state="0">value 3</pair>
</section>
</topic>
</language>
这些更改不会被提交并推送到te cenral存储库。
当我在“主”分支合并“测试”分支时,我发生了冲突。即。
[master] git pull origin Test
冲突的文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<language xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="sk" xsi:noNamespaceSchemaLocation="language.xsd">
<topic name="topicName">
<section name="sectionName">
<<<<<<< HEAD
<pair key="key_1" state="1">value 1</pair>
<pair key="key_2" state="1">value 2</pair>
=======
<pair key="key_1" state="0">value 1</pair>
<pair key="key_2" state="0">value 2</pair>
<pair key="key_3" state="0">value 3</pair>
>>>>>>> b872e7d1bbbe281482baefa73e322a34c475aa92
</section>
</topic>
</language>
我不明白为什么这些变化会导致冲突。我可以确保文件没有其他更改,例如空格,制表符或新行。 (我多次重现这种冲突)
当我使用合并工具打开冲突的文件时,它没有显示冲突。它仅显示更改,并且合并工具不会自动合并新行。 (我使用git版本1.7.10.4)
有人可以解释为什么会发生这种情况,我怎样才能避免这种冲突。
提前致谢。
编辑:我正在寻找更好的合并工具来解决git冲突。我找到了 kdiff3 。 当我执行命令时:
git mergetool --tool kdiff3 sk.xml
该工具未显示,但它确实自动解决了冲突。我很开心。
现在我的问题:
1.为什么git不能这样做?
2.可以信任“kdiff3”,它解决了冲突的好处吗?我手动检查了我发布的这种类型的冲突,它解决了冲突问题。但有可能,这个工具可能会自动合并文件吗?
答案 0 :(得分:1)
虽然我们人类认识到第一个分支只是将一对0
字符更改为1
,但大多数差异/合并工具都不会看到这种情况。这些程序是面向行的
删除了2行。在那里插入了2条新线。任何相似性都是无关紧要的。
第二个分支插入另一条线,但在哪里?我们知道它在</section>
行之前,但它前面的2行被其他分支引用删除。唯一相同的是<section ... >
行。
人类可能会合理地猜测新的key_3
行应该在两个新key_1
&amp;之后插入。 key_2
行,但没有合理的方法可以在程序上确定这一点。
小心谨慎并不是不合理的。
避免这种情况需要面向字节/字符的差异工具,但也有价格。
答案 1 :(得分:0)
两条线在主分支和测试分支上都发生了变化。这是合并冲突的典型案例。
Git无法知道,如果键1和键2的状态现在为1(因为它在主站上)或0(因为它在测试中)。我们必须手动解决这个问题。