如何恢复到两次git reset操作前的Git仓库状态?
别慌,这种误操作后找不到仓库状态的情况太常见了,Git的reflog就是专门解决这类问题的——它会记录所有HEAD的变更历史,不管你是reset、checkout还是commit,每一步操作都会被记下来。咱们一步步把仓库拉回正轨:
1. 调出所有HEAD操作记录
先在终端里执行这条命令,查看完整的HEAD变动日志:
git reflog
你会看到类似这样的输出:
abcdef1 HEAD@{0}: reset: moving to HEAD . 1234567 HEAD@{1}: reset: moving to a1b2c3d fedcba9 HEAD@{2}: commit: 修复了用户中心的弹窗bug
日志是按时间倒序排列的,最新的操作在最上面。
2. 定位操作前的原始状态
你要找的是第一次执行git reset {some old sha1}之前的那条记录——也就是列表里在reset: moving to a1b2c3d(这里的a1b2c3d就是你之前用的旧SHA1)上方的那一行,比如上面例子里的fedcba9 HEAD@{2}: commit: 修复了用户中心的弹窗bug,这个fedcba9就是你操作前仓库的HEAD状态。
3. 硬重置回原始状态
找到对应的SHA1后,执行这条命令(把fedcba9换成你找到的哈希值):
git reset --hard fedcba9
这条命令会把你的HEAD、暂存区和工作区完全同步到你操作前的状态,就像什么误操作都没发生过一样。
额外提醒:处理未提交的修改
如果你在执行这些reset操作前,还有没提交到仓库的本地修改,git reset --hard会直接丢弃它们。所以先执行这条命令暂存未提交的内容:
git stash
等恢复到原始状态后,再把暂存的修改取出来:
git stash pop
补充说明:为什么之前的git reset HEAD .没用?
当你reset到旧SHA1后,HEAD已经指向那个历史提交了,这时候git reset HEAD .只是把工作区和暂存区同步到当前的旧HEAD状态,反而让你离原始状态更远。下次如果只是想浏览历史状态,建议用git checkout {old sha1},看完后直接git checkout 你的分支名就能回到原分支,不会搞乱仓库状态~
内容的提问来源于stack exchange,提问作者user3310334

