<分区>
我想删除远程分支上的一些提交。例如,如果历史记录如下:
A->B->C->D
我想删除C和D给我:
A->B
现在 HEAD 在哪里?
标签 git github git-commit
<分区>
我想删除远程分支上的一些提交。例如,如果历史记录如下:
A->B->C->D
我想删除C和D给我:
A->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---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
这会打开非常有用的交互式 rebase 屏幕:
pick sha_of_C C
pick sha_of_D D
正如 git 提示您“# If you remove a line here THAT COMMIT WILL BE LOST.”这就是我们要做的。
我删除了 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
。但是,如果您要执行推送操作,使用保护,那么在执行此操作之前,您绝对应该复制您的分支。如果您已经完全 push ,那么坚持#3 通常是一个很好的规则。
希望这对您有所帮助。
丹
关于git - 如何删除对 git 的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12959520/