如何撤销Git提交?误执行git reset --hard HEAD^后如何恢复数据?
嘿,这两个Git问题我太熟了,日常开发经常碰到,给你详细拆解下~
1. 如何撤销Git提交?
得分两种场景来处理,毕竟有没有推送到远程仓库差别很大:
场景1:提交只在本地,还没推送到远程
这种情况操作自由度高,根据你的需求选:- 想撤销提交但保留代码改动:用
git reset --soft HEAD^,执行后你会发现代码还在工作区和暂存区,只是提交记录回退了一步,改完代码可以重新提交。 - 想彻底撤销提交并丢弃所有改动:用
git reset --hard HEAD^,这个会直接把工作区、暂存区的改动全清掉,回到上一次提交的状态,执行前一定要确认这些改动不需要了! - 只是想修改最近一次提交的信息:用
git commit --amend,会自动打开编辑器让你修改提交信息,保存后就替换了原来的提交记录(如果已经推过远程,别轻易用这个,会打乱远程历史)。
- 想撤销提交但保留代码改动:用
场景2:提交已经推送到远程仓库
这种情况别直接用reset,不然会和远程仓库的历史冲突,推荐用更安全的方式:- 撤销最近一次远程提交:用
git revert HEAD,这个会生成一个新的提交,把上一次提交的所有改动反向撤销,之后推送到远程git push就行,团队协作时不会影响其他人的代码。 - 撤销指定的远程提交:先通过
git log找到要撤销的提交哈希,然后执行git revert <提交哈希>,同样会生成新的撤销提交,再推送到远程。
- 撤销最近一次远程提交:用
2. 误执行
git reset --hard HEAD^删除了最后一次提交,怎么恢复? 别慌!Git其实偷偷记录了你的所有操作,只要你没隔太久、没执行过Git垃圾回收,大概率能找回来:
第一步:找回被删除的提交哈希
执行git reflog命令,这个命令会列出你本地仓库所有的操作历史,包括那些被reset掉的提交。你会看到类似这样的记录:a1b2c3 HEAD@{0}: reset --hard HEAD^: updating HEAD d4e5f6 HEAD@{1}: commit: 这里是你被删除的提交的备注信息这里的
d4e5f6就是你不小心删掉的那个提交的哈希值。第二步:恢复提交
有两种方式可选:- 直接回到被删除的提交状态:执行
git reset --hard d4e5f6,你的仓库就会立刻回到那个提交的状态,所有改动都回来了。 - 把被删除提交的改动应用到当前分支:如果不想覆盖当前的仓库状态,用
git cherry-pick d4e5f6,这个会把那个提交的改动单独摘出来,生成一个新的提交加到当前分支上。
- 直接回到被删除的提交状态:执行
内容的提问来源于stack exchange,提问作者Shivam Gupta




