在恢复第一次合并后再次将 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)中尚未存在的更改,而不是全部。
有几个选项:
- 还原还原
- 优点:这是方法recommended by the Git documentation,而且很容易做到
- 缺点:丑陋的历史,这让人们更难理解代码是如何随着时间的推移而演变的(例如,
git blame
将显示还原的还原而不是单个提交issue-1
支线)
- rebase 恢复的分支并合并它
- 优点:
git blame
和其他历史挖掘工具更容易理解代码历史
- 缺点:查看历史记录可能有点混乱(为什么历史记录中有两组看似相同的提交?有人搞砸了 rebase 吗?)
- 编辑历史:重做您的开发分支以删除提交
M
和提交 R
- 优点:最干净的最终结果
- 缺点:
- 如果您的存储库是共享的,则很危险,除非您的用户对 Git 满意并且您已将计划传达给所有人
- 很难做到,因为 Git 没有简单的历史编辑工具:
- rebase doesn't make it easy to edit (or edit out) merges,并且
--preserve-merges
选项不适用于交互式变基,因此您最终会将 issue-2
提交展平为 develop
filter-branch
好用
总的来说我推荐的方法是还原还原。我建议遵循以下详细步骤:
- 查看原来的坏分支:
git checkout issue-1
- 合并父分支的最新提交:
git merge --no-ff develop
- 还原还原(其中
R
是还原提交的 SHA1 ID):
git revert R
- 修复分支中的缺陷。 (您已经在提交
F
中完成了此操作;为了其他人的缘故,我假设您需要进行额外的修复。)
- 测试测试测试
- 切换回父分支:
git checkout develop
- 在修复的分支中合并:
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
它并不漂亮,但人们应该能够弄清楚发生了什么。
我的情况如下。
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)中尚未存在的更改,而不是全部。
有几个选项:
- 还原还原
- 优点:这是方法recommended by the Git documentation,而且很容易做到
- 缺点:丑陋的历史,这让人们更难理解代码是如何随着时间的推移而演变的(例如,
git blame
将显示还原的还原而不是单个提交issue-1
支线)
- rebase 恢复的分支并合并它
- 优点:
git blame
和其他历史挖掘工具更容易理解代码历史 - 缺点:查看历史记录可能有点混乱(为什么历史记录中有两组看似相同的提交?有人搞砸了 rebase 吗?)
- 优点:
- 编辑历史:重做您的开发分支以删除提交
M
和提交R
- 优点:最干净的最终结果
- 缺点:
- 如果您的存储库是共享的,则很危险,除非您的用户对 Git 满意并且您已将计划传达给所有人
- 很难做到,因为 Git 没有简单的历史编辑工具:
- rebase doesn't make it easy to edit (or edit out) merges,并且
--preserve-merges
选项不适用于交互式变基,因此您最终会将issue-2
提交展平为develop
filter-branch
好用
- rebase doesn't make it easy to edit (or edit out) merges,并且
总的来说我推荐的方法是还原还原。我建议遵循以下详细步骤:
- 查看原来的坏分支:
git checkout issue-1
- 合并父分支的最新提交:
git merge --no-ff develop
- 还原还原(其中
R
是还原提交的 SHA1 ID):git revert R
- 修复分支中的缺陷。 (您已经在提交
F
中完成了此操作;为了其他人的缘故,我假设您需要进行额外的修复。) - 测试测试测试
- 切换回父分支:
git checkout develop
- 在修复的分支中合并:
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
它并不漂亮,但人们应该能够弄清楚发生了什么。