协慌网

登录 贡献 社区

从 Git 中的分支删除提交

我想知道如何删除提交。

通过delete ,我的意思是,就好像我没有进行提交,并且当我将来进行推送时,我的更改将不会推送到远程分支。

我读了 git help,我认为我应该使用的命令是git reset --hard HEAD 。它是否正确?

答案

小心: git reset --hard 将删除你的工作目录更改 。在运行此命令之前,请务必隐藏要保留的任何本地更改

假设你正坐在那个提交上,那么这个命令就会搞砸......

git reset --hard HEAD~1

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

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

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

如果你已经推了它,你需要做一个强制推动来摆脱它......

git push origin HEAD --force

但是 ,如果其他人可能已经取消了它,那么你最好开始一个新的分支。因为当他们拉动时,它会将它合并到他们的工作中,并且你会再次将它推回去。

如果你已经推动了,那么最好使用git revert来创建一个 “镜像” 提交,它将撤消更改。但是,两个提交都将在日志中。


仅供参考 - git reset --hard HEAD - 如果您想摆脱 WORK IN PROGRESS,那么git reset --hard HEAD很棒。它会将您重置为最近的提交,并清除工作树和索引中的所有更改。


最后,如果您需要找到 “已删除” 的提交,它通常存在于git reflog除非您有垃圾收集您的存储库。

如果您尚未将提交推送到任何地方,则可以使用git rebase -i来删除该提交。首先,找出提交的回程(大约)。然后做:

git rebase -i HEAD~N

~N表示最后N提交( N必须是数字,例如HEAD~10 )。然后,您可以编辑 Git 提供给您的文件以删除违规提交。在保存该文件时,Git 将重写所有以下提交,就好像您删除的那个提交不存在一样。

Git Book 有一个很好的部分,有关图片和示例的变基础。

但要小心这一点,因为如果你改变了你其他地方推进的东西,除非你计划进行强制推动,否则将需要另一种方法。

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

git rebase -i <commit>~1

这将在交互模式下启动 rebase -i ,就在您想要进行提交之前的那一点。编辑器将从那时开始列出所有提交。删除包含要删除的提交的行并保存文件。 Rebase 将完成剩余的工作,仅删除该提交,并将所有其他提交重新放回日志中。