bitbucket - 解决冲突并保留原子特征分支

时间:2017-09-21 11:43:44

标签: git bitbucket git-merge-conflict

鉴于以下git工作流程:

  • 从主分支(生产稳定代码库)创建功能分支 fb1
  • 当开发完成拉动请求时, fb1 合并到 release-branch-1.x.x
  • 从主人
  • 创建另一个功能分支 fb2
  • fb2 上完成dev时,会创建另一个pull-request并尝试合并到 release-branch-1.xx ,但由于冲突而失败(大多数)可能由 fb1
  • 中的一些代码引入

根据the documentation解决此冲突意味着 release-branch-1.xx (其中包含 fb1 代码)合并在 fb2 < / strong>在本地,决定保留什么(解决冲突),然后 fb2 被推送到远程以更新拉取请求。

这可以解决冲突,但是将 release-branch-1.x.x 的所有工作添加到 fb2 ,这是我想要避免的。假设我想恢复 fb1 合并提交, fb1 代码仍将在发布分支上,因为它是由 fb2 引入的。

有关如何避免这种情况的任何想法?

1 个答案:

答案 0 :(得分:2)

在大多数工作流程中,每个功能分支的所有者负责使用“官方”代码行保持其分支的最新状态(为了尽可能通用,我将称之为集成分支主机,尽管它可以是各种工作流程中的开发,发布或其他名称)。因此,您的方案的完整序列如下所示:

  1. 开发者1从
  2. 开始 fb1
  3. 开发者2从
  4. 开始 fb2
  5. 开发者1完成其功能并提交 pr1 以将 fb1 合并到
  6. fb1 经过测试和批准,接受 pr1 更新为 initial + fb1 < / LI>
  7. 开发人员2完成了她的功能,但发现她的分支现在已经过时了
  8. 开发人员2将合并到 fb2 并解决她的分支现在包含的冲突 initial + fb1 + fb2
  9. 开发者2提交 pr2 以将 fb2 合并到
  10. 由于feature1导致发现严重错误,因此 fb1 的合并将被还原,而master现在只包含 initial
  11. fb2 现已过期,因为已被更改,如果之前已解决冲突,则会在原始代码恢复后再次出现,以便 pr2 将无法自动合并,bitbucket会警告你。
  12. 开发者2将合并到 fb2 并解决冲突,使其分支包含 initial + fb2
  13. 开发人员2推送更新 pr2 ,然后批准并合并,从而产生分支,其中包含 initial + fb2
  14. Git在合并时使用两次提交的最新共同祖先,而不是代码分散的原始点。即使没有冲突,当来自(包括 fb1 )的更改被集成到 fb2 中时,这两个分支之间的共同祖先将是包含 initial + fb1 的master上的一个点,如果 fb1 随后从master中删除,git会看到主分支上发生了这些更改,并且生成的合并将不包含那些变化。

    您可以考虑代数合并,其中m = mergeb = basel = leftr = rightf = featurei = initial

    m = b        + diff(b,l)           + diff(b,r)
    m = (i + f1) + diff((i + f1), (i)) + diff((i + f1), (i + f1 + f2))
    m = (i + f1) + (-f1)               + (f2)
    m = i  + (f1 + -f1)                + (f2)
    m = i + f2