重新绑定一个Git合并提交

采取以下情况:

我有一些主题分支的工作,现在我已经准备好合并回主:

* eb3b733 3 [master] [origin/master] | * b62cae6 2 [topic] |/ * 38abeae 1 

我执行从主合并,解决冲突,现在我有:

 * 8101fe3 Merge branch 'topic' [master] |\ | * b62cae6 2 [topic] * | eb3b733 3 [origin/master] |/ * 38abeae 1 

现在,合并花了我一些时间,所以我做了另一个提取,并注意到远程主分支有新的变化:

 * 8101fe3 Merge branch 'topic' [master] |\ | * b62cae6 2 [topic] | | * e7affba 4 [origin/master] | |/ |/| * | eb3b733 3 |/ * 38abeae 1 

如果我尝试从主站'git rebase origin / master',我不得不再次解决所有冲突,而且我也失去了合并提交:

 * d4de423 2 [master] * e7affba 4 [origin/master] * eb3b733 3 | * b62cae6 2 [topic] |/ * 38abeae 1 

是否有一个干净的方式来重新合并提交,所以我最终有一个像我下面显示的历史?

 * 51984c7 Merge branch 'topic' [master] |\ | * b62cae6 2 [topic] * | e7affba 4 [origin/master] * | eb3b733 3 |/ * 38abeae 1 

这里有两个选项。

一个是做一个交互式的重新分配和编辑合并提交,手动重做合并,并继续rebase。

另一个是在git rebase上使用-p选项,在手册中描述如下:“而不是忽略合并,尝试重新创build它们。 这个问题进一步解释了这个问题: git的“rebase –preserve-merges”究竟做了什么(为什么?)

它看起来像你想要做的是删除你的第一次合并。 您可以按照以下步骤操作:

 git checkout master # Let's make sure we are on master branch git reset --hard master~ # Let's get back to master before the merge git pull # or git merge remote/master git merge topic 

那会给你你想要的。