40

鉴于以下git历史:

    C-I    origin/master
   /
A-B-F-G-H  master
 \   /
  D-E      branch-b

我想 rebase 我的本地master分支origin/master,但我想保留合并提交G。当我尝试简单地做一段git rebase origin/master时间时,master它被压缩D..EG并使用 的提交消息提交E,因此合并的历史记录丢失了。是否有某种方法可以在保留此合并的同时仍获得变基?为了清楚起见,我的预期结果是:

A-B-C-I-F-G-H  master
 \       /
  D-----E      branch-b
4

2 回答 2

62

添加--preserve-merges到您的变基命令。如果您的合并中有冲突解决方案,请添加“递归他们的”策略作为参数。

编辑:--preserve-merges现在已弃用,--rebase-merges改为使用

于 2011-06-03T01:07:08.203 回答
2

这不会很漂亮,但我认为你可以做到。

将 F 重新设置为 origin/master 作为新的 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

删除旧的 master 分支:

git branch -D master

不幸的是,您还必须再次进行合并(希望它不需要任何手动合并)。

我实际上并没有尝试过,所以我会先备份存储库,但我非常有信心你会得到你想要的。我还建议打开 gitk --all 并在每个命令后用“F5”刷新树,这样你就可以看到发生了什么变化。

如果其他人知道更优雅的方法,他们仍然应该发布。

于 2011-06-03T00:07:50.983 回答