0

我在合并 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”。IE

<?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>

然后将更改提交并推送到中央存储库。

分支“测试”添加了一个新节点。IE :

<?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>

然后将更改提交并推送到中央存储库。

当我在“master”分支中合并“Test”分支时,我遇到了冲突。IE

[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”可以通过trusted,那它解决冲突好不好?我手动检查了我发布的这种类型的冲突,它很好地解决了冲突。但是有没有可能,这个工具可能会不正确地自动合并文件?

4

2 回答 2

1

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

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

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

谨慎行事并非没有道理。

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

于 2013-04-18T20:41:25.330 回答
0

master 和 Test 分支上的两行都发生了变化。这是合并冲突的典型案例。

Git 不知道,键 1 和 2 的状态现在应该是 1(因为它在 master 上)还是 0(因为它在 Test 上)。我们必须手动解决这个问题。

于 2013-04-18T15:49:31.843 回答