【问题标题】:Understanding Git Cherry Pick conflict了解 Git Cherry Pick 冲突
【发布时间】:2016-02-11 04:44:27
【问题描述】:

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

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

设置

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

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

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

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

那么,现在谈谈我面临的冲突:

文件properties.datmaster中被更改,在分支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

这个 fix-commit 也需要应用于其他三个分支。所以我去每个分支并使用cherry-pick命令。

这让我在前三行出现冲突,但我真的不明白为什么。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    有点晚了,希望对你有帮助:)

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

    【讨论】:

    • PS:一旦你解决了冲突,如果你担心 git 会记住你是如何解决这种冲突的,你可以启用 git rerere: git config --global rerere.enabled true
    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多