10

我想摆脱远程分支上的一些提交。例如,如果历史看起来像:

A->B->C->D

我想删除 C 和 D 给我:

A->B

B 现在 HEAD 在哪里?

4

2 回答 2

16

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

这样做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

如果你已经推送了,就像你的情况一样,你仍然可以这样做然后做 a 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

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

pick sha_of_C C
pick sha_of_D D

正如 git 提示你“#如果你在这里删除一行,提交将丢失。” 这就是我们要做的。

我删除了该行pick sha_of_C C,这给我留下了:

pick sha_of_D D

我用 :wq 将它保存在 vi 中,结果是:

A---B---D

如果你已经推送了,就像你的情况一样,你仍然可以这样做然后做 a 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---B---C---D---Reverted_D---Reverted_C

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

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

希望这会有所帮助。

于 2012-10-18T17:07:34.057 回答
2

删除最后一次提交

$ 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
于 2012-10-18T16:43:44.977 回答