恢复合并保持决议

Revert merges keeping resolutions

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

  1. 拉动开发
  2. 开发中的分支功能/[名称]
  3. 在该分支中开发该功能
  4. 回去开发,拉开发
  5. 合并完成的特征
  6. 解决可能的冲突
  7. 推动发展

然而,有时会发生两个开发人员同时完成一项功能的情况。现在,假设两个开发人员有合并冲突。第一个推送 develop 的人会更新 origin 的 develop,所以当另一个人尝试推送时,它将失败,因为他们已经分道扬.

现在,我们不希望第二个开发人员从 develop 中拉出来并合并两者...因为它打破了 "beauty" 只有一个具有 branching/merging 功能的 develop 分支但是然后有2个开发分支。我们现在所做的是将本地开发重置为 origin/develop 并重复 merge/finish 功能,但如果合并冲突难以解决,我们必须再次执行此操作。

在图片中,我们有这个:

我想重复上次合并,但是 origin/develop 不需要手动解决我遇到的冲突。我知道我可能有新的合并冲突,但我不想重复我已经解决的冲突。

它看起来像一个 rebase --preserve-merged,但它不保留合并决议....

调整您的工作流程应该可以解决这个问题。不是将 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.

feature 开发过程中可以安全地重复步骤 1 到 3,以使 feature 与其他人推送的内容保持同步。

Here is a blog post further illustrating this technique.

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