我有一个关于 git 如何在某种情况下工作的问题。以下是步骤,假设这些是对 repo 所做的唯一改动。
现在,当我想把 "feature-2 "合并到 "master "时,我希望不会有任何冲突,因为所有从 "feature-1 "分支合并到 "master "的提交都已经在 "feature-2 "分支中了。所以,"feature-2 "应该和第六步后从 "master "分支创建的分支没有什么区别。
然而,当我想把 "feature-2 "合并到 "master "中时,我得到了合并冲突,git认为所有在 "feature-1 "中做的改动都与 "feature-2 "中的改动冲突,而它们来自完全相同的提交,并且
feature-2 "中的提交量 = ("feature-1 "中的所有提交量) + 更多的提交量。
是什么原因导致 git 认为在这种情况下存在冲突?也许在一般情况下,git是如何决定何时有合并冲突的?
现在你需要做两件事来了解git如何处理冲突。
知道了这些,我们再来看看你的例子。
让我们假设主人是像达。枝: 主人 承诺。承诺:
然后比你创建feature-1并提交一件事。它将是这样的。Branch: feature -1 承诺。承诺: (来自主人): 承诺-B
从feature-1中创建feature-2,然后提交另一件事。就会像这样。Branch: 特性 -2 承诺。承诺: (来自主人): 承诺-B (来自特征-1)。承诺-C
现在,你把Feature-1合并到master中,让我们再检查一下master。Branch: Master 承诺。承诺:, 承诺-B (来自特征-1)。承诺-D (由合并产生的提交)
你可以看到存在于master中的 "merge commit "并不存在于feature-2中,即使feature-2已经有了代码,合并后的分支分支可能会有 "merge信息 "被合并到master中,即使它在代码上没有区别。
下面是你所描述的图。
*--b--e1--e2--e3---m <- master
\ /
*--*--*--*--f1--*--*--*--f2 <- feature2
^
feature1
合并时 feature2
与主人。git
将使用提交 f1
作为 "合并基础",并将尝试将不同的 f1..m
随意 f1..f2
.
承诺 m
的额外提交带来的修改。master
-- 我给他们起的名字 e1 e2 e3
图上。
从你描述的情况来看,合并时并没有出现冲突。feature1
通过这些修改。
但这些修改之间仍然可能存在一些冲突(这些冲突将出现在 f1..m
)的修改,并在 feature2
.
在你的评论中,你提供了更多的细节:你声称你的历史实际上是 。
# no other commits on master while feature1 was branched :
*--b---------------m <- master
\ /
*--*--*--*--f1--*--*--*--f2 <- feature2
^
feature1
如果是这样的话,那么合并 feature2
变成 master
不应引发任何冲突。
你可以仔细看看你们三个分支的历史。
git log --oneline --graph master feature1 feature2
一些可能的偏差可能是 。
master
之间 b
和 m
master
之后 m
索姆的承诺 feature1
在并入之前,实际上已经重新制定了基础或修正了。master
:
*--b---------------m <- master
\ /
*--*--*--y--y <- feature1
\
x--x--*--*--*--f2 <- feature2
# if commits "y--y" are rewritten version of "x--x", there will probably
# be a conflict when combining the diff "y--y" with the diff "x--x"