43

git如何确定特定的合并有冲突以及冲突是什么?

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

使我的理解复杂化的是:

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

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

4

3 回答 3

23

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

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

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

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

于 2011-02-07T12:35:38.250 回答
7

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

于 2011-02-07T13:13:19.847 回答
3

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

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

  • 冲突(重命名/重命名)
  • 冲突(内容)
  • 冲突(重命名/目录)
  • 冲突(重命名/删除)
  • 冲突(重命名/添加)
  • 冲突(删除/修改)
  • ... 以此类推

如果您问我,是的,它们应该被记录并清楚地指出,但是它们并不是什么都可以做然后检查源.. 但是有人真的可以从这里拿起并创建一个很好的文档,然后将其发送到.git 项目。

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

于 2011-02-07T11:46:56.297 回答