在开发过程中,一不小心把重要的文件删了,是常有的事。特别是用 Git 管理项目时,有时候执行了 git rm 或者手动删除后提交了变更,心里顿时咯噔一下。别慌,只要文件曾经被 Git 跟踪过,就有办法找回来。
文件刚删还没提交?直接还原
如果你只是删了文件,但还没运行 git commit,恢复最简单。Git 还保留着工作区的修改记录,用下面这行命令就能把所有已删除但未提交的文件复原:
git checkout -- .
如果你想只恢复某个特定文件,比如 config.js,可以指定文件路径:
git checkout -- config.js
已经提交了删除操作?从上一个版本取回
有时候你不仅删了文件,还执行了 git add 和 git commit。这时候也不能急着重写代码,Git 的历史记录就是你的“时光机”。
先查一下最近的提交记录,找到删除文件之前的那个版本:
git log --oneline
假设你看到类似这样的输出:
a1b2c3d Remove config.js
f4e5d6c Update README
说明 a1b2c3d 这次提交删了文件。你想恢复,就得从它的前一个版本(f4e5d6c)中把 config.js 拿回来:
git checkout f4e5d6c -- config.js
这时候文件就回到工作区了,记得再提交一次把它加回去:
git add config.js
git commit -m "Restore config.js"
文件从未被跟踪?Git 也无能为力
要注意的是,如果这个文件是你刚创建、还没执行过 git add,就被删了,那 Git 历史里根本没有它,也就没法恢复。这种情况只能靠编辑器的本地历史或者系统备份,所以及时提交是个好习惯。
用 reflog 找更久远的操作
如果你记不清具体是哪次提交删的,或者分支切换太频繁,可以试试 reflog。它记录了你在本地仓库的所有动作:
git reflog
你会看到类似:
a1b2c3d HEAD@{0}: commit: Delete unused files
f4e5d6c HEAD@{1}: checkout: moving from main to dev
然后就可以基于 HEAD@{1} 或任意位置恢复文件,方法和前面一样:
git checkout HEAD@{1} -- filename.txt
恢复完成后,文件会出现在工作区,确认没问题再提交即可。
小技巧:预防胜于恢复
平时开发时,不要一口气删一堆文件再提交。每次改动尽量小,提交信息写清楚,这样万一出问题,追溯和恢复都轻松得多。就像做饭前先把食材摆好,出了错也能快速回头。”}