如果某个文件在提交前从你的 Mac 项目中消失了,请先检查 Mac 的废纸篓以及是否有时间机器(Time Machine)或云端恢复选项。然后检查 Git:如果该版本存在于暂存区(index)或某次提交中,Git 就可以恢复已删除的文件,并有可能找回以不可达对象(unreachable object)形式保存的内容。如果该文件仅作为未保存或未暂存的工作副本内容存在,Git 可能没有任何副本。在项目中创建新文件之前,请先逐步完成这些检查。

1. 检查废纸篓并在 Mac 上搜索

从程序坞(Dock)中打开废纸篓,按文件名查找该文件。如果找到了,按住 Control 键点按该文件并选择放回原处以将其恢复到原始位置,或者将其拖移到安全的位置。Apple 还建议,如果文件可能已被移动或重命名,可以使用聚焦(Spotlight)进行搜索。对于位于 iCloud 云盘中的项目文件夹,还可以检查废纸篓以及 iCloud 的“最近删除”或“数据恢复”选项;Apple 表示,符合条件的已删除 iCloud 云盘文件通常可以在 30 天内恢复。Apple 的 iCloud 恢复说明

如果某个开发工具直接删除了该文件,或者废纸篓已被清空,请继续下一步。不要以为所有删除操作都会经过废纸篓。

2. 在时间机器中查找(包括本地快照)

如果启用了时间机器(Time Machine),请连接备份磁盘(如果可用)。在“访达”(Finder)中,打开原本包含该文件的文件夹,使用聚焦打开时间机器,然后浏览时间线或备份箭头至删除之前的日期。选择该文件并点按恢复。Apple 表示恢复的项目会返回其原始位置,因此如果你想在替换任何内容之前先比较版本,可以考虑将其恢复到其他单独的位置。Apple 的时间机器项目恢复指南

即使备份磁盘未连接,也并不一定意味着无法恢复。时间机器可以使用保存在 Mac 上的本地快照,但这些快照是临时的:Apple 表示快照通常每小时保存一次并保留 24 小时,是否保存额外快照取决于可用空间。它们仅在正在使用时间机器时存在,并不能替代外部备份。关于时间机器本地快照

3. 从 Git 恢复已跟踪的文件

打开终端,切换到项目目录,在恢复任何内容之前先检查文件的状态:

git status --short

如果显示了被删除文件的路径且该文件处于被跟踪状态,请使用相对于项目的路径从暂存区恢复它:

git restore -- path/to/file.ext

这会将暂存区中的版本复制到工作区(working tree)中。如果暂存区中没有该文件,但它存在于最新的提交中,请改从 HEAD 恢复:

git restore --source=HEAD -- path/to/file.ext

二者的区别很重要:对于工作区恢复,git restore 默认从暂存区读取;而 --source=HEAD 则明确选择最新提交。恢复操作会使用选定的版本覆盖工作区中的指定路径,因此请先将该位置上任何重要的文件复制出来备存。Git 在其 git restore 手册中详细记录了这些恢复来源和行为。

这些命令无法恢复从未跟踪过的全新文件,也无法恢复从未暂存或提交过的修改。Git 仅能识别已进入其暂存区、提交或对象数据库中的版本。

4. 万不得已时,搜索 Git 的不可达对象

有时即使没有任何分支或提交指向某个文件内容,Git 也可能已经保存了它——例如,曾经暂存过但随后又从暂存区中移除的版本。在项目目录下,检查不可达对象:

git fsck --unreachable

Git 可能会报告一个不可达的 blob 以及紧随其后的对象 ID。要在不修改项目的情况下检查候选对象,请使用:

git cat-file -p OBJECT_ID

将 OBJECT_ID 替换为报告中显示的 ID。如果输出内容正是丢失的文件,请将其重定向到项目外部的恢复副本中,例如:

git cat-file -p OBJECT_ID > "$HOME/Desktop/recovered-file.txt"

此处的文件名和扩展名仅供参考;请根据具体文件选择合适的保存位置和名称。Git blob 仅存储内容,而不存储原始路径,因此你可能需要自行检查各个候选对象并确认正确的文件名。git fsck 会报告不可达对象,并且其 --lost-found 选项可以将 blob 内容写入 .git/lost-found/other/ 目录下;但这两种方法都不能保证必定有可恢复的版本。Git 的 git fsck 文档

当所有恢复来源都没有该文件时

如果废纸篓、备份、云端恢复、Git 暂存区、提交记录以及 Git 不可达对象中都没有该文件,那么通过这些已有文档记录的工具可能就无法找回副本了。特别是从未暂存过的未跟踪文件,完全不在 Git 保存的历史记录之中。如果你使用过编辑器的本地历史记录功能或其他备份服务,请检查它们;其可用性和恢复步骤取决于相应的产品。在排查过程中,请保持项目现状不变,并将任何恢复的内容另存为新名称,直到你确认它是所需的版本。

参考来源