rebase恢复合并分支

Zty*_*tyx 32 git merge

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

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

git checkout fixedtopic
git rebase master
Run Code Online (Sandbox Code Playgroud)

git决定它不愿意重放旧的提交,因为它们已经合并到了master.相反,它只是做一个快速的rebase.

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

额外:

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

jur*_*lic 14

实现此目的的一种方法是以交互方式重新绑定主题分支,并在分支出master之后重新编写第一个提交(例如,git rebase -i HEAD~10如果您在分支中有10个提交).这将重写主题分支内所有提交的sha.因此,您将能够以通常的方式改变git rebase master.

  • 这对我来说不起作用,即使提交消息被修改(git 2.22),它仍然尝试在尝试变基时应用do noop。 (2认同)

小智 13

文档(git help rebase)表明"git rebase --force-rebase"就是这样 - 但是(Git 1.9.1)它没有.该文档建议"git rebase -i --no-ff"等同于该命令 - 但它不是:它确实有效.

克隆了你的要点,命令:

  git checkout topic
  git rebase -i --no-ff --onto master 7b3af topic
Run Code Online (Sandbox Code Playgroud)

使用新版本的"第三"和"第四"提交在master之上,并topic指向新版本的"4th" ,产生所需的结果.在第二个命令中,SHA 7b3af是"第二个"提交,即topic从中分支的点.

  • 为什么`--force-rebase`不像宣传的那样工作?! (3认同)

Lou*_*ron 7

使用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)
Run Code Online (Sandbox Code Playgroud)

我创建了一个带有A-B-C提交的 dev 分支并将其合并MW. 我想变基A-B-Cmaster,并再次合并之前解决问题。

这是我所做的:

git checkout C          (detached HEAD) 
git checkout -b redo
git rebase -i master
Run Code Online (Sandbox Code Playgroud)

但此时,git 只提供给我以下内容:

noop

# Rebase A..C onto X (1 command)
Run Code Online (Sandbox Code Playgroud)

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

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

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

pick A
pick B
pick C
Run Code Online (Sandbox Code Playgroud)

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

p A
p B
p C
Run Code Online (Sandbox Code Playgroud)

这终于像魅力一样奏效了。

  • 这是唯一适用于当前(截至 2020 年 1 月 21 日)版本 git 的答案。 (2认同)

CB *_*ley 6

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

例如(签出主题分支):

git rebase --onto master <id-of-branch-point>
Run Code Online (Sandbox Code Playgroud)

因为<id-of-branch-point>您想要git merge-base您的主题分支和在您恢复的合并之前在 master 上的提交。

编辑

再次重新阅读您的情况,如果您将主题分支快进到恢复合并的点,然后恢复恢复并从该点修复主题分支,可能会更好这样,您就不会重复原始主题分支中的所有提交,而是在 master 的最终历史记录中获得新的 id。无论你做什么,最终都会得到一个涉及“执行、撤消、重做”的历史记录,但这种方式可能被认为是更干净的历史记录。