现在该怎么做
- 先查看回收站;如果项目已推送到远程仓库,就重新克隆。
- 如果.git文件夹还在,用git restore、git reflog和git stash找回文件和提交。
- 尚未提交的工作,先查看VS Code时间线或JetBrains本地历史,再从U盘运行工具扫描硬盘。
操作步骤
停止构建并查看回收站
不要在该硬盘上安装依赖包、构建或运行测试,这些操作会写入成千上万个文件。先查看回收站:在文件资源管理器或很多IDE中删除的文件通常会进入回收站,而rm -rf、del、Remove-Item、git clean等命令会绕过回收站。
从远程仓库重新克隆
如果项目已推送到GitHub、GitLab或其他服务器,就把它重新克隆到一个新文件夹。所有已提交并推送的内容都会原样回来,缺少的只是从未推送的本地工作。
.git还在时使用git
如果只删除了部分文件,git status会列出它们,git restore加上路径通常就能恢复最后一次提交的版本。误执行git reset --hard后,git reflog会显示可以回到的早先提交。用git stash list查看暂存起来的工作。只用git add暂存但从未提交的文件,有时可以用git fsck --lost-found找到。
查看编辑器的本地历史
在VS Code中打开文件的时间线视图,本地历史与项目分开保存。对于已删除的文件,在同一路径新建一个空文件,常常就能显示它以前的记录。在JetBrains系列IDE中,右键单击项目文件夹,打开Local History中的Show History,已删除的文件会列在其中并可还原。
扫描硬盘查找文件夹
在U盘上运行便携版FileFix Ultimate,打开已删除文件恢复,选择硬盘并开始均衡扫描。在文件夹树中找到项目路径,或按cs、py、js、ts、java等扩展名筛选。依赖和构建文件夹可以重新生成,跳过即可。
保存到别处并验证代码
把恢复的文件夹保存到另一块物理磁盘。在新位置打开,运行构建和测试,并用git diff与远程仓库比较,因为部分被覆盖的文件乍看之下也可能显得正常。
为什么git通常比磁盘扫描更好
.git文件夹以压缩形式保存了所有被跟踪文件的每一个已提交版本。只要它还存在,无论在本地还是远程,已提交的代码就没有真正丢失,用对命令即可恢复。这也是为什么删除包含.git的整个项目文件夹比删除几个文件更严重:如果没有推送,历史也一起没了。
未提交的更改就不同了。git从未见过它们,所以现实的来源是编辑器本地历史、编辑器为未保存标签页做的备份,以及磁盘本身。FileFix Ultimate的未保存文件查找功能也会寻找VS Code和Notepad++的备份副本,其中可能保留了编辑器关闭时仍打开的标签页里的代码。
恢复扫描对源文件能做什么、不能做什么
照片和文档以可识别的文件头开始,即使文件系统已经忘了它们,签名搜索也能找到。源代码是没有这种文件头的纯文本。代码能否找回取决于文件系统记录:被删文件夹的NTFS条目还在时,名称、路径和文件夹结构会一起回来;条目被重新使用后,文本文件基本上就找不到了。
在NTFS上,很小的文件常常直接存放在文件记录内部,所以有时大文件没了,短小的配置文件和源文件却还在。项目里的图片、压缩包、SQLite数据库等二进制文件仍可按签名找到,但没有名称。
WSL或虚拟机中的项目
放在WSL 2里的代码位于一个通常名为ext4.vhdx的虚拟磁盘文件中,里面是ext4文件系统。先运行wsl --shutdown,把这个文件复制到另一块磁盘,再打开副本;FileFix Ultimate可以打开VHDX映像并以只读方式读取ext4。在ext4中删除的文件比在NTFS中更难连同名称恢复,所以请把它当作一次机会,而不是可靠的途径。虚拟机的VMDK、VHDX和QCOW2磁盘也可以用同样的方法打开。
无法恢复的情况
- 大多数开发电脑使用启用TRIM的固态硬盘,删除的文件几乎会立即被擦除,未提交的代码可能就此无法找回。
- 如果删除之后在同一硬盘上安装了依赖包或进行了构建,空闲空间很可能已被重新使用。
- 没有残留的文件系统记录时,纯文本源文件无法通过签名找到。
- 从未提交、推送,也没有被编辑器历史记录的工作,一旦磁盘空间被覆盖就没有可恢复的副本。
FileFix Ultimate能帮你做什么
- 个人使用免费且没有恢复限制,提供可从U盘运行的便携版,不会向开发用硬盘写入新数据。
- 从NTFS、FAT32和exFAT记录中重建被删除的文件夹树,记录尚存时保留文件名和路径。
- 通过未保存文件查找功能找到未保存编辑器标签页的VS Code和Notepad++备份。
- 可打开VHDX、VMDK和QCOW2映像并以只读方式读取ext4,适用于放在WSL或虚拟机中的代码。
FileFix Ultimate 个人使用免费、可离线使用,并且不会向你正在恢复的驱动器写入数据。工作或商业用途需为每台电脑购买一年期许可。运行前请检查签名。
常见问题
我执行了git reset --hard,提交还能找回吗?
通常可以。运行git reflog,找到重置之前的提交,在它上面创建分支或重置回去。从未提交的更改不在reflog里,只有暂存过的可能用git fsck找到。
git clean删除的文件会进回收站吗?
不会。git clean直接删除未跟踪的文件,所以回收站里看不到它们。剩下的办法是编辑器本地历史或磁盘扫描。
node_modules和构建文件夹也要恢复吗?
不需要。它们可以根据项目文件和锁文件重新生成,源代码找回后重新安装更快也更安全。不恢复它们还能让结果更小,检查起来更快。
恢复的文件会保留原来的名称和文件夹吗?
通过文件系统记录找到的会保留。源文件没有其他方式能找到,所以只要出现在文件夹树中,通常就带着原来的名称。