Git 焚决!一个绝招助你找回丢失的代码文件!
当前位置:点晴教程→知识管理交流
→『 企业管理交流 』
众所周知,代码只要提交到 git 仓库就有记录。哪怕是被覆盖或者删除了,都可以从仓库进行还原 但是如果代码没有提交,却不小心被搞丢了,还有办法找回吗? 答案是有的,我已经踩过坑并整理到文章中了 希望大家永远不会遇到这种糟心事 一旦碰上了,那滋味简直...不堪回首 你也不想代码被不小心搞丢后从头再写一遍吧? 赶紧收藏转发,保不齐哪一天就能用上呢 也可以提前学习,养成良好习惯,避免文件找不回来,有备无患! 我在项目中新增了一个“歌词本”文件夹,存了 50 首爱听的歌
因为不是所有的情况都能找回丢失的文件, 所以下面我将模拟 4 种场景进行测试,测试哪一种场景才能找回丢失的文件 2. 场景测试2.0 测试说明接下来我会在 4 种不同的场景下分别运行这个 注意:命令皆在项目根目录(与.git 文件夹同级)下执行预期:如果 2.1 场景-1:未暂存 -> 运行 git fsck --lost-found 命令现在是未暂存状态
运行命令
命令执行成功,但是却没有生成 lost-found 文件夹 2.2 场景-2:未暂存 -> 删除文件 -> 运行 git fsck --lost-found 命令为了节省文章空间,这里就省略截图了 重新运行命令 也没有生成 lost-found 文件夹 现在我把“歌词本”文件夹暂存(git add .)
再次运行命令 还是没有生成 lost-found 文件夹
节省文章空间,截图就省略了 重新运行命令 也没有生成 lost-found 文件夹 2.5 场景-5:已暂存 -> 删除文件 -> 再次暂存 -> 运行 git fsck --lost-found 命令然后我把“歌词本”文件夹整个给丢弃了,再次暂存(git add .)
最后运行命令
这次成功了!!! .git 文件夹下面生成了 lost-found 文件夹,打开后里面有 other 文件夹, other 里面就是曾经暂存过的所有文件列表 可以看到正好 50 个项目 这些文件是以其对象的 SHA 哈希值命名的,但是文件内容就是原始内容(如果是文本文件,就可以直接打开查看)
在实际项目中,我们还可以再结合 不是 git add 之后,文件就会到.git/lost-found/other 目录中,而是当内容删除后才存在!! 3. 找回前提:文件 add 到暂存区过! 现在来解释,为啥只有 场景-5:已暂存 -> 删除文件 -> 再次暂存 -> 运行 git fsck --lost-found 命令 才能找回丢失文件的原因 执行 git add . 命令的时候,Git 会把 歌词本里面的 50 个.txt 文件内容存成 50 个 blob 对象,写入 .git/objects/ 文件夹 但是只有“悬挂”(dangling)-无引用,但存在的对象能通过 fsck 恢复到 .git/lost-found/ 目录中 未被 git 记录的文件,和 git 中正常存在(有引用关系)的文件是不会出现在 .git/objects/ 目录中,这就是为什么只有添加到暂存区后主动删除后才能生成到 .git/lost-found/ 文件夹的原因 只要你把文件暂存到 git 中,git 就会记住它,哪怕你之后 git reset,git rebase,cherry-pick,或者提交拉取覆盖,切换分支甚至删除文件。 只要这个 blob 还没被 git gc 清理,它就能被 git fsck --lost-found 找出来
4. git fsck --lost-found 命令解释
这是一个诊断和恢复工具,常用于修复损坏的仓库或找回意外丢失的数据。
悬挂的提交(commits)会放在 其他悬挂对象(如树、blob 或标签)会放在 这些悬挂对象通常是因为操作如 git rebase、git reset 或手动删除引用而产生的。它们不是仓库损坏的标志,而是 Git 的正常行为(Git 默认保留这些对象一段时间,以防需要恢复)。 5. 通过关键词快速搜索我想在一大堆文件中找到想要的文件怎么办? 直接 vscode 打开整个 .git/lost-found/other 目录,然后全局搜索关键词即可
我本来还研究了半天的搜索命令,最后发现还不如在 vscode 中全局搜索方便😓 6. 搜索进阶!查找最近修改的 15 个文件
我想找回最近被误删的文件,难道要挨个打开查看文件内容吗? 好问题,我也给你想到了解决方法。继续往下看。
其实在我清理缓存之前 .git/lost-found/other 文件夹是存在两千多个文件的,如下图所示
要想在这两千多个文件中找到我丢失的那 50 个歌词文件,工作量可想而知! 毕竟不是所有的文件我都记得住,通过关键词查找回来 别急,我有好办法! 我现在新增 15 个不同格式的文件进行测试
然后把文件暂存后删除,测试能否精确找回这 15 个文件 注意!需要重新运行 还是在项目
成功提取出最近修改的 15 个文件,并将其存入自动创建的
用 vscode 打开项目,会发现除了 js,html,vue,txt 等文本文件打开后可以直观的看见内容外,其他的格式根本看不了一点,那咋搞?别急,请看下文-判断文件类型 解释:脚本遍历 other/ 中的 SHA,查找对应 .git/objects/ 中的文件,获取 mtime,按时间降序复制前 N 个到新目录 recent_lost/。这样你只需检查少数文件。 tip:如果想调整找回的数量,自己把 15 这个数字更改即可 7. 如何判断文件类型?运行下面这个循环脚本能批量检查文件类型
如图所示,html,json,js,excel,jpg,mp4,pdf,dwg 等格式都能正确判断出来 然后挨个复制哈希值,在 recent_lost 文件搜索文件:按组合键 chrl + p -> 粘贴哈希值
在 vscode 中找到这个 excel 的哈希值对应的文件,然后鼠标右键, 然后手动更改文件后缀为对应的文件类型,即可还原内容啦!
其他的格式我就不挨个还原啦,步骤都跟还原 excel 一样的 8. git 瘦身
运行这个命令后,删除 lost-found 文件夹,然后新增文件暂存删除暂存后重新 git fsck --lost-found,就会发现,以前的被清理干净了,只剩下了刚才新增删除的文件
可是我运行后发现并没啥用,估计是我这个仓库有好几年的历史了,长期累积导致体积变大,压无可压了
总结
该文章在 2026/1/8 16:40:44 编辑过 |
关键字查询
相关文章
正在查询... |