如何在执行Git硬重置后恢复本地丢失的修改文件?
别慌!Git其实在后台记录了几乎所有操作轨迹,你的gitdash-1、gitdash-2、gitdash-3很大概率还能找回来,咱们一步步来尝试恢复:
第一步:查看Git操作日志(reflog)
Git的reflog是个宝藏工具,它会记录所有HEAD指针的变动,包括你那次hard reset操作。先在终端运行这个命令:
git reflog
你会看到一串类似这样的条目(每个条目对应一次操作):
a1b2c3d HEAD@{0}: reset --hard origin/your-branch: updating HEAD d4e5f6g HEAD@{1}: commit: 本地修改的提交信息(如果你之前把修改提交到本地过) g7h8i9j HEAD@{2}: checkout: moving from main to your-branch
重点找你执行hard reset之前的那个提交ID(比如上面的d4e5f6g),这个版本里应该包含你丢失的三个文件。
第二步:恢复到目标版本
情况1:你的修改已经提交到本地
如果之前你把gitdash系列文件的修改做过本地提交(哪怕没推送到远程),直接用下面的命令恢复到那个提交:
git reset --hard d4e5f6g
执行完后,你的本地仓库就会回到hard reset之前的状态,丢失的三个文件应该就出现在工作区了。
情况2:你的修改从未提交过(仅在工作区修改)
如果之前没做过git add或git commit,那试试这个命令扫描Git的对象库,找出未被引用的文件:
git fsck --lost-found
这个命令会把所有“孤儿”文件放到仓库根目录下的.git/lost-found/文件夹里。你可以进入这个目录,查看里面的文件内容(可能需要用cat命令查看),找到gitdash系列文件后,复制到你的工作区即可。
第三步:安全处理远程分支冲突(避免再次丢失)
文件找回后,别急着直接push,建议按照下面的流程处理远程分支的差异,避免再次覆盖:
- 先把当前修改暂存起来:
git stash - 拉取远程分支的最新版本:
git pull origin your-branch - 恢复暂存的修改:
git stash pop - 如果出现冲突,手动解决冲突后,再执行
git add、git commit、git push即可。
小提醒:避免再踩同样的坑
以后遇到“当前分支落后于远程分支”的提示,别直接用hard reset,优先试试git pull --rebase——它会把你的本地修改“嫁接”到远程最新提交的顶部,既能同步远程内容,又不会覆盖你的本地修改。另外,重要的本地修改记得定期做本地提交,哪怕只是加个“临时保存”的备注,这样就算操作失误,也能通过reflog快速找回。
内容的提问来源于stack exchange,提问作者Rufat Aliyev

