What constitutes a merge conflict in Git?
Git如何确定特定合并存在冲突以及冲突是什么?
我的猜测是这样的:如果合并的两个提交有一个共同的父提交,并且它们都改变了父提交的X行,那么这就是一个冲突。
使我理解复杂的是:
- "更改行x"意味着用几个新行替换它,这仍然显示为一个冲突(版本A有这一行,版本B有这5行,或者其他的)。
- 如果你在其中一个提交中插入了行,一个哑巴算法会认为所有后续的行都发生了变化:第30行现在有第25行的前一个内容,第31行有第26行的前一个内容,等等,但是Git可以告诉你这些内容是相同的,我不知道怎么做。
有人能解释一下这是如何工作的吗,或者给我指一个链接?
基本上,对于git来说,每次合并都是一个冲突,这会给您留下一个索引,其中包含每个文件的三个版本、每个分支和基础的版本。在这个索引上,运行各种解析器,可以为每个单独的文件决定如何解决问题。
第一个阶段是一个普通的解析器,它处理诸如未更改的文件、一个分支修改了一个文件而另一个没有修改的情况,或者两个分支都包含该文件的相同新版本。
然后,是插件检查剩余的案例。有一个插件通过识别一个分支中的单个更改(如diff)并尝试将这些更改应用到另一个分支来处理文本文件,如果不起作用,则返回放置冲突标记。此时,您可以轻松地钩住自己的合并工具,例如,您可以编写一个工具,它知道如何合并XML文件,而不会违反良好的格式性,或者提供一个图形用户界面,允许交互式编辑和并排查看(例如,kdiff3这样做)。
因此,冲突的表示实际上与所使用的插件有关;文本文件的默认插件将使用与cvs相同的样式,因为使用了人和工具,而且冲突标记在几乎任何编程语言中都是已知的语法错误。
我不认为合并算法对Git有什么特别之处:它是一种经典的三向合并算法(而不是codeville算法),可以与多种策略一起使用(默认:recurse、resolve或octopus)。其结果是一个相当简单的合并过程,如本文所述。然后将任何可视化需求委托给第三方合并/差异工具。
浏览本页的
Le:对于冲突案例和文件冲突标记没有真正的文档,而且由于我在这里的评论中受到了抨击,这里是源代码中的指针,这些指针指向了接近Git为了达到冲突状态所遵循的策略的地方。文件合并recursive.c,搜索
- 冲突(重命名/重命名)
- 冲突(内容)
- 冲突(重命名/目录)
- 冲突(重命名/删除)
- 冲突(重命名/添加)
- 冲突(删除/修改)
- …ANS等等
如果你问我,是的,它们应该被记录下来并清楚地指出,但是它们并没有留下什么可以做的,那么检查源代码。但有人真的可以从这里获取并创建一个好的文档,然后将其发送到Git项目。
@是的,这也取决于合并策略,但是冲突是如何呈现的,提供了更多的见解。如果你问我的话,你也可以阅读合并策略,但你仍然不确定。