Git
英语 ▾ 主题 ▾ 版本 2.44.0 ▾ git-restore 最后更新于 2.44.0

名称

git-restore - 恢复工作树文件

概要

git restore [<options>] [--source=<tree>] [--staged] [--worktree] [--] <pathspec>…​
git restore [<options>] [--source=<tree>] [--staged] [--worktree] --pathspec-from-file=<file> [--pathspec-file-nul]
git restore (-p|--patch) [<options>] [--source=<tree>] [--staged] [--worktree] [--] [<pathspec>…​]

说明

从恢复源中使用某些内容恢复工作树中的指定路径。如果某个路径被跟踪,但在恢复源中不存在,它将被删除以匹配源。

该命令还可以用于使用 --staged 恢复索引中的内容,或使用 --staged --worktree 恢复工作树和索引。

默认情况下,如果给定 --staged,则从 HEAD 恢复内容,否则从索引恢复。使用 --source 从不同的提交中恢复。

参阅 git[1] 中的“重置、恢复和还原”以了解这三个命令之间的差异。

此命令为实验性命令。行为可能发生改变。

选项

-s <tree>
--source=<tree>

使用给定树中的内容恢复工作树文件。通常通过指定与之关联的提交、分支或标签来指定源树。

如果没有指定,则从 HEAD(如果给定 --staged)恢复内容,否则从索引恢复。

作为特殊情况,如果 AB 只有一个合并基础,你可以使用 "A...B" 作为 AB 的合并基础的快捷方式。你最多可以省略 AB 中的一个,在这种情况下,它默认为 HEAD

-p
--patch

在还原源和还原位置之间的差异中交互选择块。请参阅 git-add[1] 的“交互模式”部分,了解如何操作 --patch 模式。

请注意,--patch 不接受路径规范,并且会提示还原所有已修改的路径。

-W
--worktree
-S
--staged

指定还原位置。如果未指定任何选项,则默认还原工作树。指定 --staged 将仅还原索引。同时指定两者会还原两者。

-q
--quiet

安静,禁止反馈消息。暗示 --no-progress

--progress
--no-progress

默认情况下,当进度状态附加到终端时,会在标准错误流上报告,除非指定了 --quiet。此标志即使未连接到终端,也会启用进度报告,而不管 --quiet 如何。

--ours
--theirs

从索引还原工作树中的文件时,对未合并的路径使用阶段 #2(ours)或 #3(theirs)。从树形(即使用 --source 选项)检出路径时无法使用此选项。

请注意,在 git rebasegit pull --rebase 期间,ourstheirs 可能出现互换。有关详细信息,请参阅 git-checkout[1] 中相同选项的说明。

-m
--merge

从索引还原工作树上的文件时,在未合并的路径中重新创建冲突合并。从树形(即使用 --source 选项)检出路径时无法使用此选项。

--conflict=<style>

与上面 --merge 选项相同,但更改了显示冲突块的方式,覆盖了 merge.conflictStyle 配置变量。可能的值为“merge”(默认)、“diff3”和“zdiff3”。

--ignore-unmerged

从索引中恢复工作树上的文件时,如果存在未合并的条目,并且未指定 --ours--theirs--merge--conflict,则不要中止操作。工作树上的未合并路径保持不变。

--ignore-skip-worktree-bits

在稀疏检出模式下,默认情况下仅更新与 $GIT_DIR/info/sparse-checkout 中的 <pathspec> 和稀疏模式匹配的条目。此选项忽略稀疏模式,并无条件恢复 <pathspec> 中的任何文件。

--recurse-submodules
--no-recurse-submodules

如果 <pathspec> 命名了一个活动子模块,并且恢复位置包括工作树,则仅当提供此选项时才会更新子模块,在这种情况下,其工作树将恢复到超级项目中记录的提交,并且任何本地修改将被覆盖。如果未使用任何内容(或 --no-recurse-submodules),则不会更新子模块工作树。就像 git-checkout[1] 一样,这将分离子模块的 HEAD

--overlay
--no-overlay

在覆盖模式下,该命令在恢复时绝不会删除文件。在非覆盖模式下,将删除未出现在 --source 树中的已跟踪文件,以使其与 <tree> 完全匹配。默认值为非覆盖模式。

--pathspec-from-file=<file>

Pathspec 在 <file> 中传递,而不是命令行参数。如果 <file> 正好为 -,则使用标准输入。Pathspec 元素由 LF 或 CR/LF 分隔。Pathspec 元素可以引用,如配置变量 core.quotePath 所述(请参阅 git-config[1])。另请参阅 --pathspec-file-nul 和全局 --literal-pathspecs

--pathspec-file-nul

仅在使用 --pathspec-from-file 时才有意义。Pathspec 元素由 NUL 字符分隔,所有其他字符均按字面意思解释(包括换行符和引号)。

--

不要将任何其他参数解释为选项。

<pathspec>…​

限制受操作影响的路径。

有关更多详细信息,请参阅 gitglossary[7] 中的 pathspec 条目。

示例

以下序列切换到 master 分支,将 Makefile 还原到两个版本之前,错误地删除 hello.c,然后从索引中将其取回。

$ git switch master
$ git restore --source master~2 Makefile  (1)
$ rm -f hello.c
$ git restore hello.c                     (2)
  1. 从另一个提交中取出一个文件

  2. 从索引中还原 hello.c

如果你想还原所有 C 源文件以匹配索引中的版本,你可以说

$ git restore '*.c'

注意 *.c 周围的引号。文件 hello.c 也将被还原,即使它不再位于工作树中,因为文件通配符用于匹配索引中的条目(而不是 shell 中的工作树中的条目)。

还原当前目录中的所有文件

$ git restore .

或还原具有顶级 pathspec 魔术的所有工作树文件(请参阅 gitglossary[7]

$ git restore :/

还原索引中的文件以匹配 HEAD 中的版本(这与使用 git-reset[1] 相同)

$ git restore --staged hello.c

或者你可以同时还原索引和工作树(这与使用 git-checkout[1] 相同)

$ git restore --source=HEAD --staged --worktree hello.c

或更实用的简短形式,但可读性较差

$ git restore -s@ -SW hello.c

另请参见

GIT

git[1] 套件的一部分

scroll-to-top