了解Git Cherry Pick冲突

时间:2015-11-10 10:21:26

标签: git merge-conflict-resolution cherry-pick git-cherry-pick git-merge-conflict

我们最近从SVN切换到GIT,我在转换以前的工作流程时遇到了一些麻烦。大多数情况下一切正常,但今天我得到了一个奇怪的樱桃挑选冲突。

我能够解决冲突,但我想知道这是从哪里来的,因为根据我的理解,在这种情况下不应该发生冲突。

设置

在我们的存储库中,我们有一个master分支,我们在其上开发。我们一年四次发布新版本。我们将master分支到Release-x,并在测试后发货。

我们同时在生产中有几个发布版本。如果发现错误,则必须在所有(支持的)发布分支上修复此错误。因此,使用标签识别不同版本的单个版本分支不是有效的工作流程。

所以我们目前有这些分支:masterRelease-15Q1Release-15Q2Release-15Q3

比如说我们在master中发现了导致错误的拼写错误,我们会修复它,然后cherry-pick将其修改为Release-15Q1Release-15Q2Release-15Q3

所以,现在我正面临冲突:

分支properties.dat后,master中的文件Release-15Q3已更改

Properties.dat Release-15Q3

serverip=1.1.1.1
serverport=11
name=MyApp

Properties.dat master

serverip=2.2.2.2
serverport=22
name=BetterName

发展继续......一切都很好。 然后我们注意到一个错误,我们需要在文件中添加一个额外的属性来禁用该错误。

Properties.dat master

  serverip=2.2.2.2
  serverport=22
  name=BetterName
+ allowBug=false

此修复提交还需要应用于其他三个分支。所以我去每个分支并使用cherry-pick命令。

这给了我前三行的冲突,但我真的不明白为什么。

我假设选择樱桃只会重播该特定提交,所以只在正确的位置添加 allowBug = false 行。如果做出其他改动也没关系,对吧?因为我没有合并分支?

为什么会发生冲突?这些其他变化不应该被忽略吗?

1 个答案:

答案 0 :(得分:1)

当发出cherry-pick时,第一个git会计算与其父级的差异。这导致了一个diff文件(a.k.a.补丁)。此补丁不仅包含已更改的内容(即+ allowBug=false),还包含已更改行的周围上下文。因此,补丁文件看起来像:

@@ -1,7 +1,7
serverip=2.2.2.2 
serverport=22  
name=BetterName
+ allowBug=false

计算补丁后,git会尝试将其应用到您的发布分支中。补丁文件的上下文行(没有+/-的那些)告诉git where 应用+ allowBug=false。由于在发布分支上的Properties.dat中找不到周围的上下文,因此无法应用补丁并且git会引发冲突。

有点晚了,但希望有所帮助:)

编辑:您可以查看git cherry-pick: how consider only lines modified by the commit (i.e., not the surrounding context)?