如何从rebased分支和rebase中删除提交

时间:2013-08-04 16:02:05

标签: git git-branch git-rebase

我有分支

B1 --c01--c02--c03--c04 
B2 --c11--c12--c13--c14

我用B1重新分配B2分支

B2 --c01--c02--c03--c04--c11--c12--c13--c14

两个分支机构正在同步发展,现在B1发生了巨大的变化,必须重新投入B2

所以,我需要删除所有旧--c01--c02--c03--c04并用新数据替换它们!!

有人可以帮我怎么做吗?

2 个答案:

答案 0 :(得分:1)

通常,历史不应该改变。改变历史使合作变得更加复杂,而且应该如此。

但鉴于历史记录已经发生变化,并且您希望在重写的分支上重放一堆提交,您可以将git rebase--onto选项一起使用:

git rebase --onto new-c04 old-c04 B2
# or: git rebase --onto new-c04 c11^ B2

上述命令将在old-c04(不包括)和B2分支(包括)的提示之间进行所有提交,并将它们重播到提交new-c04。它还会将B2分支指针移动到新历史记录的新提示(包括您的提交)。

您可能需要查看补丁排队系统,例如guilt或TopGit。

答案 1 :(得分:0)

如果您以与遥控器不一致的方式在本地修改了B2,则可以执行许多操作。一种方法是:

git checkout B2 # make sure
git branch broken # create a branch to remember this point
git reset --hard @{u} # reset everything on B2 back to the position on the remote head
git pull --rebase # B2 will now be as the remote

我假设当你说--c01 - c02 - c03 - c04需要替换来自远程仓库的其他提交。那么剩下的B2就是将c11 - c12 - c13 - c14重播回分支。你可以挑选或改变这些变化:

git rev-list broken~4..broken | git cherry-pick --stdin

如果是远程分支,也需要重置B1。