在恢复第一次合并后再次将 git 分支 A 合并到分支 B

Merging git branch A into branch B once again after the first merge has been reverted

我的情况如下。

              o---o---o issue-2 
             /         \
o---o---o---o---M---R---o develop
         \     /
          o---o---F issue-1

有一些关于问题 1 的工作。经过审核,合并到develop(commit M)。不幸的是,很快就发现存在一些严重的错误。为了其他问题,合并提交被还原(提交 R)。后来,其他问题(如 issue-2)也被合并到 develop 中。原始分支上的代码已修复(提交 F)。

问题是 - 现在如何将 issue-1 合并到 develop 中?简单的合并将保留还原提交 R 的效果,并且仅应用开发分支(提交 F)中尚未存在的更改,而不是全部。

有几个选项:

  1. 还原还原
    • 优点:这是方法recommended by the Git documentation,而且很容易做到
    • 缺点:丑陋的历史,这让人们更难理解代码是如何随着时间的推移而演变的(例如,git blame 将显示还原的还原而不是单个提交issue-1支线)
  2. rebase 恢复的分支并合并它
    • 优点:git blame和其他历史挖掘工具更容易理解代码历史
    • 缺点:查看历史记录可能有点混乱(为什么历史记录中有两组看似相同的提交?有人搞砸了 rebase 吗?)
  3. 编辑历史:重做您的开发分支以删除提交 M 和提交 R
    • 优点:最干净的最终结果
    • 缺点:
      • 如果您的存储库是共享的,则很危险,除非您的用户对 Git 满意并且您已将计划传达给所有人
      • 很难做到,因为 Git 没有简单的历史编辑工具:
        • rebase doesn't make it easy to edit (or edit out) merges,并且 --preserve-merges 选项不适用于交互式变基,因此您最终会将 issue-2 提交展平为 develop
        • filter-branch好用

总的来说我推荐的方法是还原还原。我建议遵循以下详细步骤:

  1. 查看原来的坏分支:
    git checkout issue-1
  2. 合并父分支的最新提交:
    git merge --no-ff develop
  3. 还原还原(其中 R 是还原提交的 SHA1 ID):
    git revert R
  4. 修复分支中的缺陷。 (您已经在提交 F 中完成了此操作;为了其他人的缘故,我假设您需要进行额外的修复。)
  5. 测试测试测试
  6. 切换回父分支:
    git checkout develop
  7. 在修复的分支中合并:
    git merge --no-ff issue-1

结果图应如下所示:

              o---o---o issue-2 
             /         \
o---o---o---o---M---R---o-------------o develop
         \     /         \           /
          o---o---F-------o---RR---F2 issue-1

它并不漂亮,但人们应该能够弄清楚发生了什么。