如何删除git的提交

时间:2012-10-18 16:39:28

标签: git github git-commit

我希望摆脱远程分支上的一些提交。例如,如果历史记录如下:

A->B->C->D

我想删除C和D给我:

A->B

其中B现在是HEAD?

2 个答案:

答案 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