繁体   English   中英

了解 Git Cherry Pick 冲突

[英]Understanding Git Cherry Pick conflict

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

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

设置

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

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

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

例如,我们发现一个错字导致master的错误,我们会修复它,然后将其cherry-pickRelease-15Q1Release-15Q2Release-15Q3

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

在分支Release-15Q3之后,文件properties.datmaster被更改

Properties.dat ( Release-15Q3 )

serverip=1.1.1.1
serverport=11
name=MyApp

属性.datmaster

serverip=2.2.2.2
serverport=22
name=BetterName

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

属性.datmaster

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

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

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

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

为什么这会引起冲突? 不应该忽略这些其他更改吗?

当发出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:如何仅考虑由提交修改的行(即,不是周围的上下文)?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM