2011-06-02 71 views
31

鉴于以下git历史:如何避免git rebase查杀合并提交?

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

我要变基上的origin/master上面有我的地方master分支,但我希望保留合并提交G。当我试着简单地做一个git rebase origin/master,而在master时,它压制D..EG,并承诺用E的提交信息,所以存在合并的历史丢失了。有没有办法保留这个合并,同时仍然获得rebase?为了清楚起见,我的预期结果是:

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

回答

44

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

+11

或只是'-p'。 – 2011-09-02 15:33:53

+6

关于这个标志会发生什么荒谬的细节,请参阅我的答案在http://stackoverflow.com/questions/15915430/what-exactly-does-gits-rebase-preserve-merges-do-and-why。 – Chris 2013-09-30 20:03:05

+4

你能否详细说明为什么递归他们在这种情况下会有所帮助?合并提交'G'可以使用不同的冲突解决策略创建,难道不会? – 2015-12-10 12:13:25

2

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

再次基于˚F到原点/主作为新的主分支:

git checkout F 
git checkout -b new_master 
git rebase origin/master 

合并分支-B到您的新的分支:

git merge branch-b 

樱桃挑残留的H提交到你的新主人分支:

git cherry-pick master 

删除你的旧主人的分支:

git branch -D master 

不幸的是,你也将不得不再次合并(希望它不需要任何手动合并)。

我没有真正尝试过,因此我会先备份存储库,但我相信您会得到您想要的。我也建议在每个命令之后打开gitk --all并用“F5”刷新树,这样你就可以看到有什么变化。

如果他们知道更优雅的方式来执行操作,则其他人仍应该发帖。