如何避免git rebase查杀合并提交?

时间:2011-06-02 23:47:08

标签: git version-control git-merge git-rebase

鉴于以下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

2 个答案:

答案 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”刷新树,这样你就可以看到正在发生的变化。

如果他们知道更优雅的方式,那么其他人仍然应该发帖。