如何从分支历史记录中删除提交?我应该使用git reset-hard HEAD吗?


当前回答

另一种可能是我个人最喜欢的命令之一:

git rebase -i <commit>~1

这将在您要执行的提交之前以交互模式-i启动重新启动。编辑器将开始列出此后的所有提交。删除包含要删除的提交的行并保存文件。Rebase将完成剩下的工作,只删除该提交,并将所有其他提交重新播放到日志中。

其他回答

使用git还原https://git-scm.com/docs/git-revert。它将还原所有代码,然后您可以进行下一次提交。然后head将指向上一次提交的代码。还原的提交不会删除,但不会影响您上次提交。

小心:git reset-hard将删除您的工作目录更改。在运行此命令之前,请确保隐藏所有要保留的本地更改。

假设您正在执行该提交,则此命令将使其变得古怪。。。

git reset --hard HEAD~1

HEAD~1表示在HEAD之前提交。

或者,您可以查看gitlog的输出,找到要备份的提交的提交id,然后执行以下操作:

git reset --hard <sha1-commit-id>

如果你已经推了它,你需要用力推才能摆脱它。。。

git push origin HEAD --force

然而,如果其他人已经成功了,那么你最好开始一个新的分支。因为当他们拉动时,它会将其合并到他们的工作中,你会再次将其推高。

如果您已经推送了,那么最好使用git-restore创建一个“镜像”提交,以撤消更改。但是,这两个提交都将在日志中。


仅供参考——git reset——如果你想摆脱“正在进行的工作”,那么硬头非常好。它会将您重置为最近的提交,并清除工作树和索引中的所有更改。


最后,如果您需要找到您“删除”的提交,除非您已经垃圾收集了存储库,否则它通常会出现在gitreflog中。

当我提交并推送时,我通常会做什么(如果有人推送他的提交,这可以解决问题):

git reset --hard HEAD~1

git push -f origin

希望这有帮助

另一种可能是我个人最喜欢的命令之一:

git rebase -i <commit>~1

这将在您要执行的提交之前以交互模式-i启动重新启动。编辑器将开始列出此后的所有提交。删除包含要删除的提交的行并保存文件。Rebase将完成剩下的工作,只删除该提交,并将所有其他提交重新播放到日志中。

正如您在上图中看到的,我想删除revert“test change 2”提交(SHA1 ID:015b5220c50e3dfbb1063f23789d92ae1d3481a2(您可以使用gitbash中的gitk命令获取SHA1 ID))。

为此,我可以使用(以下所有命令仅适用于本地。删除后需要推送):

git reset--hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2//将您备份到该提交(测试更改4提交的SHA1 ID为515b5220C50e3dfbb 1063f23799d92ae 1d3481A2)gitreset-hardHEAD~1//它在一次提交之前备份您。git reset--hard HEAD ^//从git中删除最后一次提交

删除后: