什么是合并冲突?

60

我创建了一个git仓库,并添加了一个文本文件。这完全是为了学习目的。

  1. 我向文本文件中添加了 "1" 并提交到主分支。

  2. 从主分支创建了一个新分支并添加了 "2"。

  3. 最后,从主分支创建了一个分支并添加了 "3"。

请问您能否解释一下在此或其他情况下如何发生冲突?

3个回答

46

如果您将以下分支合并:

  • branch2master(无冲突)
  • branch3master(有冲突):

这是因为:

  • 公共祖先是 master(第二行为空白)
  • 源内容为 branch3(第二行包括“3”)
  • 目标内容是最新的 master (第二行包括“2”,来自于将 branch2 合并到 master

Git 会要求您选择保留哪个内容(“3”、“2” 或两者兼有)。

首先,完成以下合并:

git config merge.conflictstyle diff3

查看 "在Git中解决合并冲突?"。


注释:


1
@user3693167 是的,因为同样的代码行被修改了两次,这会触发合并(冲突)的手动解决。 - VonC
1
@user3693167 是的,就重叠的内容块而言 (https://help.github.com/articles/resolving-a-merge-conflict-from-the-command-line)。还可以参考 http://www.gitguys.com/topics/merging-with-a-conflict-conflicts-and-resolutions/。 - VonC
所以,关于这个答案最重要的事情是:Git在考虑共同祖先的情况下决定冲突发生的位置。 - Dumoko
1
@Dumoko 是的,这是一个三路合并(https://dev59.com/5m855IYBdhLWcg3w0H13#4130766),也在 https://dev59.com/1Yzda4cB1Zd3GeqPpazM#31227165 中展示了。 - VonC
1
@Vin,这不是关于顺序的问题,而是关于自上次共同祖先以来进行的并发修改。因此会产生冲突。 - VonC
显示剩余6条评论

42

当两个分支对同一个文件的区域进行修改并随后合并时,就会发生合并冲突。Git无法知道保留哪种更改,因此需要人工干预来解决冲突。

在这种情况下,您的第2步和第3步创建了两个具有冲突更改的分支。


3
“region”是什么意思?它们有多大? - Guillaume F.
@GuillaumeF。对于文本文件,当两个提交更改文件中的相同行时,就会发生冲突。我不确定二进制文件(例如图像、声音等)是如何工作的。 - Caleb
@Caleb,你能解释一下你所说的“are subsequently merged”是什么意思吗? - Istiaque Ahmed
1
@IstiaqueAhmed 假设你有一个共享的存储库,其中包含一个名为C的公共分支,你和朋友各自创建了自己的分支。我们称你的分支为D,朋友的分支为E。你们都对同一个文件的同一部分进行了修改。现在当你尝试将D和E合并回C时,你会发现第二次合并会导致冲突。 - Caleb
1
@IstiaqueAhmed 假设你有一个共享的存储库,其中有一个名为C的公共分支,你和一个朋友各自创建了自己的分支。我们将你的分支称为D,朋友的分支称为E。你们各自修改了同一个文件的同一部分。现在当你尝试将D和E合并回C时,你会发现第二次合并会导致冲突。 - undefined
显示剩余2条评论

3

我知道这是一个旧问题,但是如果您想以一种直观的方式了解Git用于比较两个文件的算法,以下内容会澄清关于重叠区域如何使用差异(diff)的疑惑。

这里是Eugene W. Myers开发的一种流行算法的解释。在这种方法中,查找最短编辑脚本(SES)被建模为图搜索。以下是一个非常好的文章,由James Coglan提供相同的例子 -The Myers diff algorithm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接