大头B电脑储存空间不够了,要删除一些没有的文件,看到有个项目代码仓库some-repo-20210701没用了,想到一直在some-repo这个目录开发,就把这个过时的删了吧。
代码敲起来rm -rf some-,oh my zsh 还有提示,真贴心,tab -> enter,眼疾手快,bong~
大头B傻眼了,怎么删了把some-repo删了,刚刚还有代码没提交,stash 也还有东西未提交,完蛋了。再看还没关闭的 vscode,除了刚才还打开的几个文件,都清空了,哦嚯
大头B一时蒙圈,不可能重新做吧,还有 stash 里的,东西可没记得那么多。
赶紧搜一波rm -rf之后怎么恢复。。。有一些方法,但看起来不怎么靠谱啊
慢着,大头B想起平时在 vscode 删除文件,ctrl+z就能恢复,然鹅,这次是在shell里整个干掉的。。。
不放弃,大头B又记得之前 vscode 更新了个本地文件历史的功能,找找找,找到了,是 Timeline。但这是针对单个文件的,除了还没关闭的几个文件,其他的早不知去向。万能的网络再搜一遍,有提到利用IDE本地记录恢复的一些帖子(How to recover the deleted files using "rm -R" command in linux server? - Stack Overflow、How can I see local history changes in Visual Studio Code? - Stack Overflow),但vscode是针对单个文件的追踪,找不到一整个目录。
思前想后,大头B决定死马当活马医,如果把文件都先恢复,应该可以再利用 vscode 保存的文件历史进行恢复。一番操作,有惊喜~
- 重新从远程 clone 一份代码(新目录),切换到最后的分支(与本地最后编辑最接近的分支)
- 将内容全部 copy 到原来的目录(如果已经删除,需要新建同名目录),
cp new-repo/ old-repo/ - 使用 vscode 打开原来的目录(已打开的可以忽略),会发现已打开窗口的内容都有东西
- 原来工作区有未提交的内容,找到对应的文件,打开 vscode 的 Timeline(vscode 对文件的保存记录),从历史记录中恢复即可。如果是新的未提交过的文件,可以新建同名的文件,再从 Timeline 恢复
- vscode 里查看 stash 的内容,发现stash记录还在(使用 GitLens 扩展),但无法直接应用这些stash,点击查看内容也是空的。但由于这些文件都保存过,vscode 有记录,只需要选择该文件,从 Timeline 里操作恢复即可。但需要注意,未恢复完成前,stash 新的内容会清空原来已失效的 stash 历史!
- 如果原来已提交内容到本地分支,很遗憾,由于
.git目录被清空,无法再恢复。
最神奇的是,vscode 还把 stash 的东西保留了~
大头B平时都是用 vscode 进行 git stash 操作,这波不亏~ 大头B想,其他有文件历史功能的IDE应该也能如此恢复,这个功能平时不起眼,关键时候起作用了,不错。
虽然恢复了一些内容,但大头B还是丢失了不少东西(甚至忘了有什么,惨),所以大头B也得到了个教训,勤快点提交代码,然后推送到远程仓库,这才是最平安的方式。