初始提交前执行git reset --hard导致文件丢失如何恢复
无初始提交时执行
git reset --hard丢失工作区文件的恢复方案 你在执行git add .时,Git已经将所有追踪到的文件内容以blob对象的形式存入了本地仓库的对象存储,哪怕还没创建任何提交,git reset --hard仅会清空暂存区索引和工作区文件,已经生成的blob对象在触发Git自动垃圾回收前都会保留,可按以下步骤完整恢复:
- 第一步:扫描仓库内的悬空对象
在项目根目录执行以下命令,列出所有没有被引用的存储对象:
命令输出中所有标记为git fsck --lost-founddangling blob的条目,就是你之前add进暂存区的文件内容,Git会自动把这些对象的原始内容导出到.git/lost-found/other/目录下。 - 第二步:从导出目录找回文件
进入.git/lost-found/other/目录,这里的所有文件就是你丢失的项目文件,只是文件名被替换为了对应的Git哈希值:- 如果文件数量少,直接用编辑器逐个打开文件查看内容,手动改回原文件名、放回原项目的对应目录结构即可。
- 如果文件数量多,可以先用
file *命令(Linux/macOS)或第三方文件类型识别工具批量判断文件类型,给对应文件加上正确后缀,再通过搜索你记忆中的项目特有代码片段、匹配文件大小/二进制头信息的方式,把文件放回原位置。
注意:恢复过程中不要在当前仓库执行
git gc命令,也不要写入大量无关文件,避免悬空blob被垃圾回收机制永久清除,导致文件无法找回。
附:「排除单个暂存文件」的正确操作
首次提交前如果add了全部文件、想临时排除某一个文件,不需要执行reset类高危命令,直接运行以下命令即可把目标文件移出暂存区:
git restore --staged <要排除的文件路径>
之后把该文件路径写入项目根目录的.gitignore文件,再执行提交就不会把这个文件纳入版本控制。
内容的提问来源于stack exchange,提问作者kindermichal
相关产品推荐
相关产品推荐

