背景:我最近将一个相当大的主题分支合并到了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因为它有点麻烦.
额外:
jur*_*lic 14
实现此目的的一种方法是以交互方式重新绑定主题分支,并在分支出master之后重新编写第一个提交(例如,git rebase -i HEAD~10如果您在分支中有10个提交).这将重写主题分支内所有提交的sha.因此,您将能够以通常的方式改变git rebase master.
小智 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从中分支的点.
使用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 分支并将其合并M到W. 我想变基A-B-C上master,并再次合并之前解决问题。
这是我所做的:
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)
这终于像魅力一样奏效了。
您需要使用--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。无论你做什么,最终都会得到一个涉及“执行、撤消、重做”的历史记录,但这种方式可能被认为是更干净的历史记录。