恢复合并保持分辨率

时间:2016-02-09 17:13:39

标签: git git-flow

在我们的团队中,我们正在应用git flow而没有pull请求,也就是说,我们每个人都在自己的分支中开发功能,这些功能从开发开始,一旦完成,它们就会合并到开发中。我们的工作流程是:

  1. 拉开发展
  2. 分支功能/ [name] from develop
  3. 在该分支中开发该功能
  4. 回去开发,拉开发展
  5. 合并完成的功能
  6. 解决可能的冲突
  7. 推动开发
  8. 然而,有时候两位开发人员在同一时间完成一项功能。现在,想象两个开发人员有合并冲突。推动发展的第一个将更新原点的发展,所以当另一个试图推动时,它将失败,因为它们已经分歧。

    现在,我们不希望第二个开发人员从开发和合并两个开始......因为它打破了只有一个开发分支的“美”,它具有从中分支/合并的功能,但后来有2个开发分支。我们现在所做的是将本地开发重置为origin / develop并重复合并/完成功能,但如果合并冲突难以解决,我们必须再次进行。

    在图片中,我们有: Git graph

    我想重复最后一次合并,但是使用origin / develop而不必手动解决我遇到的冲突。我知道我可能会遇到新的合并冲突,但我不想重复我已经解决的问题。

    它看起来像一个rebase --preserve-merged,但这不会保留合并解析....

2 个答案:

答案 0 :(得分:2)

对您的工作流程进行调整可以解决此问题。不要将feature合并到develop,而是将feature重新绑定到develop。如果develop向前爬行,那么feature分支的工作仍然完成:它们只需要在新分支之上进行重组。你总是试图在develop分支的尖端上工作。这使事情变得更加简单。

这是一个例子。这是两个开发人员准备合并的状态。他们都更新了develop

A - B - F [origin/develop] [develop]
     \
      C - D - E [feature/1]

A - B - F [origin/develop] [develop]
 \
  Z - X - Y [feature/2]

他们都是git rebase develop。 (这将产生新的提交ID,但我在这些图中重用相同的ID以显示提交内容的连续性)。

         [origin/develop] [develop]
A - B - F - C - D - E [feature/1]

         [origin/develop] [develop]
A - B - F - Z - X - Y [feature/2]

为了保留历史记录中分支的存在,它们都进行合并但使用--no-ffgit checkout develop; git merge --no-ff feature/X这实际上并没有合并,而是形成了一个很好的功能泡泡,这对后来的代码考古学有用,可以理解哪一系列提交是作为单个特征一起完成的。

         [origin/develop]
A - B - F - C - D - E [feature/1] [develop]
        \          /
         ----------

         [origin/develop]
A - B - F - Z - X - Y [feature/2] [develop]
         \          /
          ----------

然后他们都推,但第一个开发者首先到达那里。第二个推送被拒绝,因此第二个开发者更新develop

A - B - F - C - D - E [feature/1] [origin/develop] [develop]
        \          /
         ----------

          Z - X - Y [feature/2]
         /
A - B - F - C - D - E [origin/develop] [develop]
        \          /
         ----------

没问题,第二个开发人员重复这个程序。他们重新加入develop。这只需要解决与feature/1的新提交冲突。

A - B - F - C - D - E - Z - X - Y [feature/2] 
        \          /  [origin/develop] [develop]
         ----------

然后git checkout develop; git merge --no-ff feature/2; git push

                      ---------
                     /         \
A - B - F - C - D - E - Z - X - Y [feature/2]
        \          /              [origin/develop] [develop]
         ----------

最后两位开发者都删除了他们的本地分支机构。历史泡沫和合并点将保留其信息以供历史使用。

这是过程。

  1. 更新develop
    • git checkout develop
    • git pull --rebase
  2. 重新定位功能到develop
    • git checkout feature
    • git rebase develop
  3. 创建一个人工合并点。
    • git checkout develop
    • git merge --no-ff feature
  4. 推送develop
  5. 删除feature
  6. feature开发过程中,可以安全地重复步骤1到3,以使feature与其他人推动的内容保持同步。

    Here is a blog post further illustrating this technique

答案 1 :(得分:0)

rerere正是您所寻找的;启用后,它会记住您是如何解决合并冲突的,当它看到相同的冲突时,会自动为您解决这些冲突。使用git config --global rerere.enabled true启用它。您可以阅读更多相关信息here