理解Git Cherry-Pick冲突



我们最近从SVN切换到GIT,在转换以前的工作流程时遇到了一些问题。大多数情况下,一切都是可行的,但今天我遇到了一个奇怪的挑拨离间的冲突。

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

设置

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

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

因此,我们目前有以下分支:masterRelease-15Q1Release-15Q2Release-15Q3

例如,我们在master中发现了一个导致错误的拼写错误,我们将修复它,然后将cherry-pick将其放到Release-15Q1Release-15Q2Release-15Q3

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

在分支Release-15Q3 之后,文件properties.datmaster中发生了更改

属性.datRelease-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计算与其父级的差异。这会产生一个diff文件(也称为补丁)。此补丁不仅包含已更改的内容(即+ allowBug=false)),还包含已更改行的周围上下文。因此,补丁文件看起来像:

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

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

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

EDIT:您可能会看到gitcherry-pick:如何只考虑提交修改的行(即,不考虑周围的上下文)?

相关内容

  • 没有找到相关文章

最新更新