rebase恢复合并分支

时间:2013-08-27 10:18:21

标签: git merge

后台:我最近将一个相当大的主题分支合并到master。几天后,我发现这个主题分支包含错误。所以我git revert -m 1 <merge-commit>编辑了它。

问题:现在我想查看主题分支并将其与当前master重新绑定,以便我可以1)修复错误并且2)(再次)合并用master修好了主题分支。创建新分支fixedtopic是很容易的部分,但每次我都这样做

git checkout fixedtopic
git rebase master

git决定它不愿意重播旧提交,因为它们已经合并到master。相反,它只是做一个快速的变革。

问题:如何使用fixedtopic强制将提交重播到rebase?我可以吗?我宁愿不使用cherry-pick,因为它有点麻烦。

其他

  • git reset合并提交它不是一个选项,因为我已将主服务器上游推送。
  • 我宁愿不从master创建一个新的分支并恢复我的恢复。这样做的原因是我想使用交互式rebase重写一些主题分支的历史。
  • 以下是该场景的github要点:https://gist.github.com/JensRantil/6352495请注意,我希望将e8df5ec和ee16464应用到master(或基于master的分支)。

6 个答案:

答案 0 :(得分:12)

文档(git help rebase)表明&#34; git rebase --force-rebase&#34;这样做 - 但是(Git 1.9.1)它没有。文档表明&#34; git rebase -i --no-ff&#34;等同于该命令 - 但它不是 工作。

克隆了你的要点,命令:

  git checkout topic
  git rebase -i --no-ff --onto master 7b3af topic

产生所需的结果,使用新版本的&#34;第三个&#34;和&#34;第四&#34;在master上提交,topic指向&#34;第四个&#34;的新版本。在第二个命令中,SHA 7b3af是&#34; second&#34;提交,topic分支的点。

答案 1 :(得分:11)

实现此目的的一种方法是交互式地重新定义主题分支并在分支出主分支后重新编写第一个提交(例如,如果分支中有10个提交,则为git rebase -i HEAD~10)。这将重写主题分支内所有提交的sha。因此,您可以使用git rebase master改变常规方式。

答案 2 :(得分:1)

您需要使用--onto来防止Git表单尝试自行确定适当的未合并提交。

E.g。 (已签出主题分支):

git rebase --onto master <id-of-branch-point>

对于<id-of-branch-point>,您需要主题分支的git merge-base和主上的提交您还原的合并。

修改

再次重新阅读您的情况,如果您将主题分支快进到恢复合并的位置,那么可能会更好,然后恢复还原并修复主题分支点。这样您就不会重复原始主题分支中的所有提交,但在master的最终历史记录中会有新的ID。无论你做什么,你最终都会得到一个涉及“do,undo,redo”的历史记录,但这样可能被认为是一个更清晰的历史。

答案 3 :(得分:1)

最好的方法是检查一个新分支,然后通过还原恢复来重新启动上一个工作分支。

我尝试的其他所有内容都过于复杂和/或无法正常工作。

答案 4 :(得分:0)

对于git merge(即不是最初要求的git rebase),按照7.8 Git Tools - Advanced Merging(请参阅“撤消提交”部分):

  

解决此问题的最佳方法是取消还原原始合并,因为现在您要引入已还原的更改,然后创建一个新的合并提交:

     

$ git revert ^M

     

<...>

     

$ git merge topic

     

History after re-merging a reverted merge   图142.重新合并还原的合并后的历史记录

答案 5 :(得分:0)

使用git 2.22,jurglic建议的解决方案似乎不再起作用。

让我们从状态开始,以确保我们在谈论同一件事:

P---o---o---M---o---o---o---o---o---W---o---o---master
 \         /     \                /
  A---B---C       D (revert A-B-C)

我创建了一个具有A-B-C个提交的dev分支,并将其合并到M中,但是我们立即注意到有一个错误,因此将其还原到W中。我想在A-B-C的基础上恢复master,并在再次合并之前解决该问题。

这是我所做的:

git checkout C          (detached HEAD) 
git checkout -b redo
git rebase -i master

但是在这一点上,git只向我提供以下内容:

noop

# Rebase A..C onto X (1 command)

这意味着它发现我正在尝试重新应用完全相同的提交,并且它们已经被合并。

要解决此问题,jurglic建议修改A的提交消息,但似乎git 2.22足够聪明,可以解决它,并且仍然为我提供完全相同的{{1 }}。我使用noop和/或--force-rebase尝试了其他解决方案,但我一直回到--no-ff

最后,我通过在noop选择编辑器中手动输入使用了一个简单的快捷方式,并将rebase -i替换为:

noop

或者,如果您想保存更多按键,则:

pick A
pick B
pick C

这终于奏效了。