我想知道如何删除提交。
通过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 将完成剩余的工作,仅删除该提交,并将所有其他提交重新放回日志中。