什么构成Git中的合并冲突?

时间:2011-02-07 11:41:55

标签: git internals

git如何确定特定合并是否存在冲突以及冲突是什么?

我的猜测会是这样的:如果合并的两个提交有一个共同的父提交,并且如果他们都改变了父X的行X,那就是冲突。

使我的理解变得复杂的是:

  • “更改行X”可能意味着将其替换为多个新行,并且仍然显示为一个冲突(版本A有这一行,版本B有这5行,或者其他)
  • 如果您在其中一个提交中插入了行,则dumber算法会认为所有后续行已更改:第30行现在具有第25行的前一内容,31具有以前的内容26,等等。但是git可以说它们是相同的,我不知道如何。

任何人都可以解释一下这是如何工作的,还是指向一个链接呢?

3 个答案:

答案 0 :(得分:22)

基本上,使用 git ,每个合并都是冲突,它会为您提供一个索引,其中包含每个文件的三个版本,每个分支和基础的版本。在此索引上,运行各种解析器,可以为每个单独的文件决定如何解决此问题。

第一阶段是一个简单的解析器,它处理诸如未更改文件之类的事情,一个分支修改文件而另一个没有修改文件的情况,或两个分支包含相同新文件版本的情况。

之后,它的插件会查看其余的情况。有一个插件可以通过识别一个分支中的各个更改(如差异)并尝试将这些更改应用到另一个分支来处理文本文件,如果不起作用则返回放置冲突标记。此时您可以轻松地挂钩自己的合并工具,例如,您可以编写一个知道如何合并XML文件而不违反格式良好的工具,或者提供允许交互式编辑和旁边的图形用户界面的工具。 - 侧视图(例如,kdiff3就是这样)。

因此,冲突的呈现实际上是使用插件的问题;文本文件的默认插件将使用与CVS相同的样式,因为人们和工具都习惯使用它,并且冲突标记在几乎所有编程语言中都是已知的语法错误。

答案 1 :(得分:7)

我不认为合并算法与Git有任何特殊之处:它是经典的3-way merge algorithmnot the Codeville one),可以使用with several strategies(默认:递归或解析)或章鱼)。 结果是fairly simply merge process described here 然后将任何可视化需求委托给第三方合并/差异工具。

答案 2 :(得分:3)

浏览此page上的HOW CONFLICTS ARE PRESENTED段。

LE:没有关于冲突案例的真实文档,也没有文件冲突标记,因为我在这里的评论中受到了抨击,这里是源代码中的指针,它们接近git遵循的策略以实现冲突国家。文件merge-recursive.c,搜索"CONFLICT字符串。通过这样做,我们可以很容易地发现存在一些冲突案例,例如:

  • CONFLICT(重命名/重命名)
  • CONFLICT(内容)
  • CONFLICT(重命名/目录)
  • CONFLICT(重命名/删除)
  • CONFLICT(重命名/添加)
  • CONFLICT(删除/修改)
  • ... ans so

如果你问我,是的,他们应该被记录并清楚地指出,但他们不是那么无所事事,然后检查来源..但有人可以真正从这里拿起并创建一个很好的文档,然后发送它到git项目。

@Wim Coenen是的,它也取决于合并策略,但是如何呈现冲突提供了更多的洞察力。如果你问我,你也可以阅读合并策略,但你仍然存在疑问。