使用git合并两个分支时发生冲突

时间:2013-04-18 15:02:48

标签: git merge branch conflict git-merge

我在合并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”,它解决了冲突的好处吗?我手动检查了我发布的这种类型的冲突,它解决了冲突问题。但有可能,这个工具可能会自动合并文件吗?

2 个答案:

答案 0 :(得分:1)

虽然我们人类认识到第一个分支只是将一对0字符更改为1,但大多数差异/合并工具都不会看到这种情况。这些程序是面向行的 删除了2行。在那里插入了2条新线。任何相似性都是无关紧要的。

第二个分支插入另一条线,但在哪里?我们知道它在</section>行之前,但它前面的2行被其他分支引用删除。唯一相同的是<section ... >行。

人类可能会合理地猜测新的key_3行应该在两个新key_1&amp;之后插入。 key_2行,但没有合理的方法可以在程序上确定这一点。

小心谨慎并不是不合理的。

避免这种情况需要面向字节/字符的差异工具,但也有价格。

答案 1 :(得分:0)

两条线在主分支和测试分支上都发生了变化。这是合并冲突的典型案例。

Git无法知道,如果键1和键2的状态现在为1(因为它在主站上)或0(因为它在测试中)。我们必须手动解决这个问题。