为什么git不给我带来任何冲突?

时间:2019-05-15 15:25:35

标签: git git-merge-conflict

我发现了一个奇怪的问题。我正在测试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显示冲突?我知道这是一个奇怪的问题,没有人需要发生冲突。但是我也不喜欢这种情况。试想一下,这发生在我的真实代码中。

更新


由于大多数评论和答案都表明不可能有这样的冲突。我必须更新此答案。

好的,让我们在删除第二行后再次执行上述所有步骤。

我们到了,

  1. 我创建了一个简单的git repo,并添加了具有以下内容的文本文件。这次,第一行和第二行之间没有空行。
Hello Git..!
First Line

作为初始提交而提交。

  1. 然后,我从该提交创建了另一个名为“ abc”的分支,并将文件内容更改为以下内容。 (再次删除空行)

(abc)->分支

Hello Git..!
First Line
Second Line

提交。

  1. 然后我签出回到我的master分支并将文件内容更改为下面的内容。

(主)->分支

Hi Git..!
First Line

已提交。

  1. 然后我尝试将“ abc”分支合并到“ master”分支。这次要说的是我有一个合并冲突

如果您不信任我,这是示例github存储库 https://github.com/Ranjith-Suranga/test-repo2

第一个不产生任何冲突,第二个几乎相同,除了删除的空行,它产生冲突。 但是问题是为什么?

5 个答案:

答案 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次提交中的更改:

commit 549009d

这显然替换了文件的第1行。这是分支abc中的落实462394b:

commit 462394b

如您所见,该更改不会涉及第1行,只会影响第3行(并添加第4行)。因此,这些更改是完全不同的,git可以毫无歧义地应用它们。

答案 3 :(得分:0)

答案是因为您已经修改了分支abc上的“第一行”,而git无法将其匹配回master分支上的“第一行”。所做的更改是在行尾添加了换行符(显示为here)。

再试一次,但初始自述文件以换行符结尾。

答案 4 :(得分:0)

当不同的用户将提交推入存储库时,Git创建冲突。如果您使用同一用户创建冲突,则这些冲突将永远不会出现。