You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何撤销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

火山引擎 最新活动