我发现了一个奇怪的问题。我正在测试git repo并发现这种情况。
我创建了一个简单的git repo,并添加了具有以下内容的文本文件。
Hello Git..!
First Line
作为初始提交。
然后我从该提交创建了一个名为“ abc”的分支,并将文件内容更改为以下内容。
(abc)->分支
Hello Git..!
First Line
Second Line
提交。然后我签出回到我的master分支,并将文件内容更改为下面的内容。
(主)->分支
Hi Git..!
First Line
提交。然后,我尝试将“ abc”分支合并到“ master”分支。我以为这会给我带来冲突,但是它已经通过递归成功合并到下面。
Hi Git..!
First Line
Second Line
它没有显示出什么冲突?有时候,如果之间没有空线,我会尝试几次,
Hello Git...!
First Line
然后表明存在冲突。我听不懂有人请帮助我理解这一点。
我进行了尽可能多的搜索,但是找不到一个问题或答案来解决我的问题。
我已将示例存储库上传到GitHub。如果有人克隆它并尝试合并,则可以复制它。
https://github.com/Ranjith-Suranga/test-repo
有什么方法可以迫使GIT显示冲突?我知道这是一个奇怪的问题,没有人需要发生冲突。但是我也不喜欢这种情况。试想一下,这发生在我的真实代码中。
更新
由于大多数评论和答案都表明不可能有这样的冲突。我必须更新此答案。
好的,让我们在删除第二行后再次执行上述所有步骤。
我们到了,
Hello Git..!
First Line
作为初始提交而提交。
(abc)->分支
Hello Git..!
First Line
Second Line
提交。
(主)->分支
Hi Git..!
First Line
已提交。
如果您不信任我,这是示例github存储库 https://github.com/Ranjith-Suranga/test-repo2
第一个不产生任何冲突,第二个几乎相同,除了删除的空行,它产生冲突。 但是问题是为什么?
答案 0 :(得分:1)
请注意,文件的所有版本包含不完整的最后一行。当添加另一行时,这意味着您不仅要添加一行,而且还删除不完整的行,然后 add 两行。
第二次尝试,当合并两个分支时,Git会检测到相邻文本块中的更改。与您可能想的相反,该行的读数
First Line
实际上不会保持不变,因为在一个分支中添加的最后一个换行符算作对该行的修改。由于您对来自不同分支的相邻行进行了修改,因此Git报告合并冲突。
首次尝试时,在行First Line
上方留空行。可以说,这条线作为锚点在合并过程中保持稳定。它使Git可以清楚地将来自不同分支的更改分为不同的文本块。因此,Git可以自动合并修改,而不会产生冲突。
答案 1 :(得分:0)
据我所知,在这种情况下不会发生合并冲突,因为这里没有冲突,因此,假设您有4行和2个分支。
情况1:在第一个分支中,您修改Line(1),在第二个分支中,您修改Line(1)和Line(2),这不是冲突
情况2:在第一个分支中,您修改行(1),在第二个分支中,您仅修改行(1)(您修改完全相同的行)这是合并冲突< / strong>。
亲自尝试,您会发现其中的区别。
答案 2 :(得分:0)
它没有显示出任何冲突吗?
可能是因为您在master
分支中所做的更改与abc
分支中所做的更改完全相同,直到“第一行”行的末尾。因此,没有冲突的更改。如果您改为在一个分支中将文件的第三行更改为“第三行”,那么您将在同一行上进行两次不同的更改,因此会发生冲突。但是,如果更改是相同,则没有问题。
有时候我尝试了几次尝试,如果它们之间没有空线,如下所示...那么这表明存在冲突。
好的。现在,您已将master
中的第二行更改为“第一行”,并将第三行更改为空,而abc
的提交在第二行和第三行中有所不同。 git
应该选择哪一个?没有办法告诉您,因此您必须解决它。在前一种情况下,git
不必在两个选项之间进行选择,因为它们都是相同的。
更新:
在更新的第1步中,您创建了包含以下内容的初始提交:
Hello Git..!
First Line
那是在master
分支中。然后,您创建一个新的abc
分支,并添加一行。然后在第3步中,您说您检出了master
,并将文件更改为
Hello Git..!
First Line
并提交了那个。但这恰恰是master
中应该有的内容,因此尚不清楚您所做的更改。听起来您在master
中有另一个提交会更改文件,或者可能还有一些杂散的空格字符。
最重要的是,git
会告诉您,当合并两个文件时无法弄清楚该怎么做时,就会发生合并冲突。带有>>>>>
,=====
和<<<<<
指示符以及已更改区域的两个版本的文件,因此您应该能够准确地看到冲突所在。 git
的不同版本甚至可能在自动解决或无法解决的原因以及原因方面有所不同。
回顾您的原始示例,并在您链接的Github存储库中,很容易看出为什么没有冲突:master
中的第二次提交和abc
中的第二次提交会影响不同的行,您可以在Github中看到它。这是master
中的549009d次提交中的更改:
这显然替换了文件的第1行。这是分支abc
中的落实462394b:
如您所见,该更改不会涉及第1行,只会影响第3行(并添加第4行)。因此,这些更改是完全不同的,git
可以毫无歧义地应用它们。
答案 3 :(得分:0)
答案是因为您已经修改了分支abc上的“第一行”,而git无法将其匹配回master分支上的“第一行”。所做的更改是在行尾添加了换行符(显示为here)。
再试一次,但初始自述文件以换行符结尾。
答案 4 :(得分:0)
当不同的用户将提交推入存储库时,Git创建冲突。如果您使用同一用户创建冲突,则这些冲突将永远不会出现。