鉴于以下git
历史记录:
C-I origin/master
/
A-B-F-G-H master
\ /
D-E branch-b
我想在master
之上重新定义我的本地origin/master
分支,但我想保留合并提交G
。当我在git rebase origin/master
时尝试简单地执行master
时,它将D..E
压缩为G
,并使用E
的提交消息将其提交,那么那里的历史就是合并失败了。有没有办法保留这个合并,同时仍然得到rebase?为清楚起见,我的预期结果是:
A-B-C-I-F-G-H master
\ /
D-----E branch-b
答案 0 :(得分:47)
将--preserve-merges
添加到您的rebase命令。如果您的合并中存在冲突解决方案,请将“递归他们的”策略添加为参数。
答案 1 :(得分:2)
这不会很漂亮,但我认为你可以做到。
将F作为新的主分支重新映射到origin / master:
git checkout F
git checkout -b new_master
git rebase origin/master
将branch-b合并到您的新分支中:
git merge branch-b
Cherry将剩余的H提交选择到新的主分支上:
git cherry-pick master
删除旧的主分支:
git branch -D master
不幸的是,您还必须再次进行合并(希望它不需要任何手动合并)。
我实际上没有试过这个,所以我会首先备份存储库,但我相信你会得到你想要的东西。我还建议打开gitk --all并在每个命令后用“F5”刷新树,这样你就可以看到正在发生的变化。
如果他们知道更优雅的方式,那么其他人仍然应该发帖。