我希望摆脱远程分支上的一些提交。例如,如果历史记录如下:
A->B->C->D
我想删除C和D给我:
A->B
其中B现在是HEAD?
答案 0 :(得分:14)
我将列出为您删除提交的所有不同方法,以及何时应该使用它们。 在您执行上述任何操作之前,我强烈建议您将分支机构复制到另一个分支机构,以确保安全。
通过git checkout -b copy_branch
执行此操作,然后通过执行git checkout the_branch_i_want_to_delete_from_again
如果你已经按下了,就像你的情况一样,你可以跳到#3,但是如果你没有按下,你可以看看1和2.
1)我还没有推动或正在单独工作,我想删除的提交是最近的提交:
如果我有: A --- ---乙Ç--- d
我想删除C和D.
然后执行git reset --hard sha_of_B
导致: A ---乙
如果你已经推动了,就像在你的情况下,你仍然可以这样做,然后做一个git push --force origin the_branch
,但不建议这样做,因为你可能会弄乱其他人在这个项目上工作。你应该关注#3。
2)我还没有推动或正在单独工作,我想删除的提交位于我的分支中间:
如果我有: A --- ---乙Ç--- d
我要删除C。
git rebase -i sha_of_B_the_commit_before_the_one_i_want_to_delete
打开了非常有用的交互式rebase屏幕:
pick sha_of_C C
pick sha_of_D D
当git提示你“#如果你在这里删除一行,那么提交就会丢失。”这就是我们要做的。
我删除了pick sha_of_C C
行,它留给我:
pick sha_of_D D
我用vq将其保存在vi中,结果是:
A --- ---乙d
如果你已经推动了,就像在你的情况下,你仍然可以这样做,然后做一个git push --force origin the_branch
,但不建议这样做,因为你可能会弄乱其他人在这个项目上工作。你应该关注#3。
3)我已经推动并且我正在与其他人合作:
如果我有: A B C D 我想删除C和D.
然后做
git revert sha_of_D
请注意,您可能必须在此处解决冲突,然后提交。 然后做
git revert sha_of_C
请注意,您可能必须在此处解决冲突,然后提交。
这导致:
A --- ---乙Ç--- --- d --- Reverted_D Reverted_C
这是可以安全推送的,因为你实际上只是添加了一个提交,它可以反转所有C和D的更改,实际上是删除它。
除非绝对必要,否则通常应该不惜一切代价避免git push --force
。但是如果你要做一个推力,使用保护,你应该在这之前复制你的分支。如果你已经完全按下,那么坚持#3通常是一个很好的规则。
希望这很有帮助。
丹
答案 1 :(得分:1)
删除上次提交
$ git reset --hard HEAD^
删除最新的2次提交
$ git reset --hard HEAD~2
您可以在本地下载分支。然后删除提交并执行push -force
$ git pull origin
$ git checkout origin/<branchname>
$ git checkout -b <branchname>
$ git reset --hard HEAD~2
$ git push origin <branchname> --force