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

Nat*_*ong 40 git internals

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

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

使我的理解复杂化的是:

  • "更改行X"可能意味着用几个新行替换它,并且仍然显示为一个冲突(版本A有这一行,版本B有这5行,或者其他)
  • 如果你在其中一个提交中插入了行,那么dumber算法会认为所有后续行都已经改变了:第30行现在具有第25行的前内容,31具有前者26的内容,等等.但是git可以告诉那些是一样的,我不知道怎么做.

任何人都可以解释这是如何工作的,或者指向一个链接吗?

Sim*_*ter 22

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

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

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

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


Von*_*onC 7

我不认为合并算法与Git有任何特殊之处:它是一种经典的3向合并算法(不是Codeville 算法),它可以与几种策略一起使用(默认:递归,或解析或章鱼).结果是一个相当简单的合并过程,这里描述.
然后将任何可视化需求委托给第三方合并/差异工具.