如何删除git的提交

vik*_*dat 8 git github git-commit

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

A->B->C->D
Run Code Online (Sandbox Code Playgroud)

我想删除C和D给我:

A->B
Run Code Online (Sandbox Code Playgroud)

哪个B现在是HEAD?

Dan*_*her 14

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

通过执行此操作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 --- B.

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

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

如果我有:A --- B --- C --- D.

我想删除C.

git rebase -i sha_of_B_the_commit_before_the_one_i_want_to_delete
Run Code Online (Sandbox Code Playgroud)

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

pick sha_of_C C
pick sha_of_D D
Run Code Online (Sandbox Code Playgroud)

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

我删除了这行pick sha_of_C C,这让我:

pick sha_of_D D
Run Code Online (Sandbox Code Playgroud)

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

A --- ---乙d

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

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

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

然后做

git revert sha_of_D
Run Code Online (Sandbox Code Playgroud)

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

git revert sha_of_C
Run Code Online (Sandbox Code Playgroud)

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

这导致:

A --- ---乙Ç--- --- d --- Reverted_D Reverted_C

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

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

希望这很有帮助.