2

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

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

设置

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

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

所以我们目前有这些分支:master, Release-15Q1,Release-15Q2Release-15Q3

比如说我们发现了一个导致错误的错字,我们会修复它,master然后将cherry-pick它放到Release-15Q1Release-15Q2Release-15Q3

所以,现在谈谈我面临的冲突:

分支后文件properties.dat已更改masterRelease-15Q3

属性.dat ( Release-15Q3)

serverip=1.1.1.1
serverport=11
name=MyApp

属性.dat ( master)

serverip=2.2.2.2
serverport=22
name=BetterName

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

属性.dat ( master)

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

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

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

我假设通过樱桃采摘你只会重播那个特定的提交,所以只在正确的位置添加allowBug=false行。是否进行了其他更改并不重要,对吧?因为我没有合并分支?

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

4

1 回答 1

1

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

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

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

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

编辑:您可能会看一下git cherry-pick:如何仅考虑提交修改的行(即,而不是周围的上下文)?

于 2016-05-02T12:03:09.543 回答