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

git如何确定一个特定的合并有冲突,冲突是什么?

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

我的理解是复杂的是:

  • “改变行X”可能意味着用几行新行代替它,这仍然performance为一个冲突(版本A有这一行,版本B有这5行,或其他)
  • 如果你在其中一个提交中插入了行,一个dumberalgorithm会认为后面的所有行都发生了变化:第30行现在有25行的前一个内容,31的前一个内容是26,等等。但是git可以告诉那些是一样的,我不知道如何。

任何人都可以解释这是如何工作,或指向我的链接呢?

基本上,使用git ,每一个合并是一个冲突,这留下了一个索引,其中包含每个文件的三个版本,每个分支和基地的版本。 在这个索引上,运行着各种parsing器,它可以决定每个文件如何解决这个问题。

第一阶段是一个简单的parsing器,它处理诸如未改变的文件,一个分支已经修改文件而另一个没有,或者两个分支包含相同新版本文件的情况。

之后,它是查看其余案例的插件。 有一个插件通过在一个分支中标识单个变化(比如差异)来处理文本文件,并试图将这些变化应用到另一个分支,如果这样做不起作用,就会放弃冲突标记。 在这一点上,您可以很容易地使用自己的合并工具,例如,您可以编写一个知道如何合并XML文件而不违反格式良好的工具,或者提供一个graphics用户界面,允许交互式编辑和旁通侧视图(例如,kdiff3这样做)。

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

我不认为合并algorithm有什么特别的Git:它是一个经典的3路合并algorithm ( 不Codeville之一 ),可以使用几种策略 (默认:recursion,或parsing或章鱼)。 结果是一个相当简单的合并过程 , 这里描述 。
任何可视化的需求,然后委派给第三方合并/差异工具。

浏览本页面的HOW CONFLICTS ARE PRESENTED段落。

LE:没有真正的冲突情况的文档,也没有文件冲突标记,因为我在这里的评论变得很糟糕,下面是源代码中的指针,指向某个地方接近git遵循什么样的策略来实现冲突状态。 文件merge-recursive.c ,search"CONFLICTstring。通过这样做,我们可以很容易地发现,真的有一些冲突的情况下,如:

  • CONFLICT(重命名/重命名)
  • CONFLICT(内容)
  • CONFLICT(重命名/目录)
  • CONFLICT(重命名/删除)
  • CONFLICT(重命名/添加)
  • CONFLICT(删除/修改)
  • …等等

如果你问我,是的,他们应该logging在案,并明确指出,但他们不是没有什么可以做,然后检查来源..但有人可以真正从这里拿起,创build一个很好的文件,然后发送到git项目。

@Wim Coenen是的,它也依赖于合并策略,但是如何呈现冲突给了更多的洞察力。 那么如果你问我,你也可以阅读合并策略,但是你仍然有疑问。