无法从Git历史提交中恢复已删除的Rails项目文件问题求助
问题根因
你定位到的提交9c88a26ade871是完成文件删除操作的提交,该提交的版本快照中已经移除了app/models/fitness/weight.rb文件,因此直接从该提交拉取路径会提示文件不存在。你要恢复的文件存储在该提交的父提交(即删除操作执行前的版本)中。
恢复操作步骤
- 方案1(单父提交场景通用,绝大多数情况可直接使用)
直接执行以下命令即可恢复目标文件,命令中的^后缀代表取指定提交的第一个父提交:
git checkout 9c88a26ade871^ -- app/models/fitness/weight.rb
如果你使用的是Git 2.23及以上版本,也可以使用语义更清晰的restore命令:
git restore --source=9c88a26ade871^ -- app/models/fitness/weight.rb
- 方案2(适用于多父提交的合并提交场景)
- 先查询该删除提交的父提交列表:
git show 9c88a26ade871
返回结果的首行commit信息后会标注Merge: 哈希1 哈希2,对应就是该合并提交的多个父提交哈希,可根据提交时间判断删除操作发生前的对应父版本。
2. 替换为你查到的父提交哈希,执行恢复命令:
git checkout [父提交哈希] -- app/models/fitness/weight.rb
小提示
如果操作时仍然提示路径不匹配,检查你输入的文件路径大小写是否和git diff-tree输出的路径完全一致,部分大小写不敏感的文件系统(比如macOS默认APFS)可能会因为大小写差异导致路径识别失败。
操作完成后,执行git status即可看到目标文件已恢复到工作区,确认内容无误后正常提交、推送到线上环境即可。
内容的提问来源于stack exchange,提问作者John Cowan
相关产品推荐
相关产品推荐

