我将为您列出删除提交的所有不同方法以及何时使用它们。
在你做任何这些之前,我强烈建议你将你的分支复制到另一个分支,以确保安全。
通过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 通常是一个很好的规则。
希望这会有所帮助。
丹