要在 macOS 上从贮藏中恢复单个文件,请使用以该贮藏为来源、以文件路径为目标的 git restore 命令。这会将该文件恢复到你的工作区中,同时保留原有的贮藏记录。首先确定正确的贮藏并检查其更改;然后恢复特定路径并查看结果。

1. 在仓库中打开终端

通过“聚焦”(Spotlight)或“访达”的“应用程序/实用工具”文件夹打开“终端”,然后使用 cd 切换到仓库目录。例如,输入 cd ,将项目文件夹拖入“终端”窗口以插入其路径,然后按 Return 键。Apple 将“终端”描述为 macOS 的命令行界面;zsh 是其默认 shell,不过管理员或用户也可以配置其他 shell。在 Mac 上打开或退出“终端”

在恢复任何内容之前,请确认你位于目标仓库中并查看本地更改:

git status --short

从贮藏中恢复可能会覆盖目标文件当前工作区的内容,因此请保存或提交该文件中需要保留的任何修改。此操作按路径进行针对性恢复,但它不是合并操作,也不具备安全备份功能。

2. 查找并检查贮藏

列出可用的贮藏条目:

git stash list

Git 将最新的条目标记为 stash@{0},下一个标记为 stash@{1},依此类推。选择包含所需版本的条目。如果描述不够明确,可以将其作为补丁进行检查:

git stash show --patch 'stash@{0}'

将 stash@{0} 替换为你确定的条目。在 zsh 中给该引用加上引号很有必要,因为大括号在 shell 中具有特殊语法。Git 官方文档说明 stash show 用于检查贮藏,而 stash apply 用于应用整个条目;下方的命令则仅从贮藏快照中提取单个路径。git-stash 文档

3. 仅恢复该文件

运行 git restore 命令,将贮藏引用作为源,并在 -- 之后指定相对于仓库的路径:

git restore --source='stash@{0}' -- 'src/config.json'

将 src/config.json 替换为你需要的确切路径,使用正斜杠并按相对于仓库根目录的方式书写。使用引号还可以防止空格和通配符被 shell 解析。--source 选项指定提交或树作为内容来源;路径规范(pathspec)限制了 Git 要恢复的路径。由于省略了 --staged,Git 将仅恢复工作区,而暂存区保持不变。git-restore 文档

现在查看更改:

git status --short
git diff -- 'src/config.json'

在通常情况下,恢复的版本是相对于暂存区而言未暂存的工作区更改。如果该文件在此之前已经暂存,请在暂存或提交之前仔细比对工作区和暂存区版本。该贮藏仍会保留在贮藏列表中,因为 git restore 只是从中读取数据,而不会应用或删除整个条目。

何时需要调整此工作流

该路径必须存在于贮藏的工作区快照中。如果不存在,Git 可能会提示路径规范不匹配;请检查补丁和文件名(包括大小写)。若某个已被跟踪的路径在源树中不存在,可能会被删除以使目标与该源树保持一致,因此若贮藏中记录了删除操作,请格外小心。Git 的 restore 文档对该行为进行了说明。git-restore 文档

本方法适用于贮藏中已跟踪工作区快照内包含的文件。使用 -u 或 -a 创建的贮藏还可以包含单独存储的未跟踪或被忽略的文件;git restore --source='stash@{0}' 不会把这些单独存储的快照视为主贮藏树。请仔细检查此类条目,并使用 Git 文档中记录的贮藏检查和恢复控制命令,切勿直接假定该命令能够检索出这些文件。git-stash 文档

如果目标是应用选定的代码行而不是整个文件,git restore -p 提供了交互式数据块(hunk)选择功能,但在依赖它之前,请针对你安装的 Git 版本确认其行为和来源。要同时恢复文件的暂存区和工作区版本,git restore 支持同时使用 --staged 和 --worktree;这也会更改暂存区,因此仅在确有此意图时使用。git-restore 文档

实际操作顺序为:确定贮藏,确认其内容中包含该文件,从所选贮藏中恢复一个相对于仓库的路径,并在继续操作前检查 diff。这样可以保持贮藏完好无损,并将恢复操作限制在你指定的路径内。

来源