关于github:如何删除git的提交

How can I delete a commit to git

本问题已经有最佳答案,请猛点这里访问。

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

1
A->B->C->D

我想删除C和D给我:

1
A->B

哪个B现在是HEAD?


我将列出为您删除提交的所有不同方法以及何时应该使用它们。
在你做任何这些之前,我强烈建议你将你的分支机构复制到另一个分支机构,以确保安全。

通过执行git checkout -b copy_branch执行此操作,然后通过执行git checkout the_branch_i_want_to_delete_from_again切换回原始分支

如果你已经推动了,就像在你的情况下,你可以跳到#3,但如果你没有推,你可以看看1和2。

1)我还没有推或没有单独工作,我想删除的提交是最近的提交:

如果我有:
A B C D

我想删除C和D.

然后做git reset --hard sha_of_B

这导致:
A ---乙

如果你已经推动了,就像在你的情况下,你仍然可以这样做,然后做一个git push --force origin the_branch,但不建议这样做,因为你可能会弄乱其他人在这个项目上工作。你应该遵循#3。

2)我还没有推或我独自工作,我要删除的提交是在我的分支中间:

如果我有:
A B C D

我想删除C.

1
git rebase -i sha_of_B_the_commit_before_the_one_i_want_to_delete

这打开了非常有用的交互式rebase屏幕:

1
2
pick sha_of_C C
pick sha_of_D D

当git提示你"#如果你在这里删除一行,那么COMMIT将会丢失。"这就是我们要做的。

我删除了pick sha_of_C C行,它离开了我:

1
pick sha_of_D D

我用vq将其保存在vi中,结果是:

A --- ---乙d

如果你已经推动了,就像在你的情况下,你仍然可以这样做,然后做一个git push --force origin the_branch,但不建议这样做,因为你可能会弄乱其他人在这个项目上工作。你应该遵循#3。

3)我已经推了,我正和其他人一起工作:

如果我有:
A B C D
我想删除C和D.

然后做

1
git revert sha_of_D

请注意,您可能必须在此处解决冲突然后提交。
然后做

1
git revert sha_of_C

请注意,您可能必须在此处解决冲突然后提交。

这导致:

A --- ---乙?--- --- d --- Reverted_D Reverted_C

这是可以安全推送的,因为你实际上只是添加一个提交来反转所有C和D的更改,实际上是删除它。

除非绝对必要,否则通常应该不惜一切代价避免git push --force。但是如果你要做一个推力,使用保护,你应该在这之前复制你的分支。如果你已经完全按下,那么坚持#3通常是一个很好的规则。

希望这很有帮助。


删除上次提交

1
$ git reset --hard HEAD^

删除最新的2次提交

1
$ git reset --hard HEAD~2

您可以在本地下载分支。然后删除提交并执行push -force

1
2
3
4
5
$ git pull origin
$ git checkout origin/<branchname>
$ git checkout -b <branchname>
$ git reset --hard HEAD~2
$ git push origin <branchname> --force