【问题标题】:How can I delete a commit to git [duplicate]如何删除对 git 的提交 [重复]
【发布时间】:2012-10-09 04:46:00
【问题描述】:

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

A->B->C->D

我想删除C和D给我:

A->B

B 现在 HEAD 在哪里?

【问题讨论】:

  • 见附件问题;除了你想要HEAD~2(删除最后2个提交)。
  • 使用git reset 删除提交。 This guide 解释了它的作用。

标签: git github git-commit


【解决方案1】:

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

通过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

打开了非常有用的交互式变基屏幕:

pick sha_of_C C
pick sha_of_D D

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

我删除了pick sha_of_C C 行,剩下的就是:

pick sha_of_D D

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

A---B---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---B---C---D---Reverted_D---Reverted_C

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

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

希望这会有所帮助。

【讨论】:

  • 很好的解释和例子,谢谢。
【解决方案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

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 2011-11-01
    • 2014-12-11
    • 2020-01-23
    • 1970-01-01
    • 2021-09-17
    • 2018-11-14
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多