[英]Understanding Git Cherry Pick conflict
我们最近从 SVN 切换到 GIT,我在转换之前的工作流程时遇到了一些麻烦。 大多数情况下一切正常,但今天我遇到了一个奇怪的挑选冲突。
我能够解决冲突,但我想知道这是从哪里来的,因为据我所知,在这种情况下不应该有冲突。
设置
在我们的存储库中,我们有一个用于开发的master
分支。 我们每年发布四次新版本。 我们将master
分支到Release-x
并在测试后发布。
我们同时有多个发布版本在生产中。 如果发现错误,则必须在所有(支持的)发布分支上修复此错误。 因此,使用标签来标识不同版本的单个发布分支不是有效的工作流程。
所以我们目前有这些分支: master
, Release-15Q1
, Release-15Q2
和Release-15Q3
例如,我们发现一个错字导致master
的错误,我们会修复它,然后将其cherry-pick
到Release-15Q1
、 Release-15Q2
和Release-15Q3
所以,现在进入我面临的冲突:
在分支Release-15Q3
之后,文件properties.dat
在master
被更改
Properties.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行。 是否进行了其他更改应该无关紧要,对吧?,因为我没有合并分支?
为什么这会引起冲突? 不应该忽略这些其他更改吗?
当发出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 引发冲突。
有点晚了,但希望它有帮助:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.