简体中文 ▾ 主题 ▾ 最新版本 ▾ git-restore 上次更新于 2.51.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] 中的“Reset、restore 和 revert”部分。

选项

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

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

如果未指定,则在指定 --staged 时,内容从 HEAD 恢复,否则从索引恢复。

作为一种特殊情况,您可以使用 "<rev-A>...<rev-B>" 作为 <rev-A><rev-B> 的合并基础的快捷方式,前提是只有一个合并基础。您可以省略 <rev-A><rev-B> 中的一个,在这种情况下,它默认为 HEAD

-p
--patch

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

-U<n>
--unified=<n>

生成具有 <n> 行上下文的 diff。如果配置选项未设置,则默认为 diff.context 或 3。

--inter-hunk-context=<n>

在差异块之间显示上下文,最多达指定行数 <number>,从而合并彼此接近的块。默认为 diff.interHunkContext,如果未设置配置选项则为 0。

-W
--worktree
-S
--staged

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

-q
--quiet

安静模式,禁止显示反馈消息。包含 --no-progress

--progress
--no-progress

默认情况下,如果进度状态流被连接到终端,则进度状态会显示在标准错误流上,除非指定了 --quiet。此标志即使未连接到终端也会启用进度报告,无论 --quiet 如何。

--ours
--theirs

当从索引恢复工作区文件时,对于未合并的路径,使用阶段 #2(ours)或 #3(theirs)。当从 tree-ish(即使用 --source 选项)检出路径时,不能使用此选项。

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

-m
--merge

从索引恢复工作区文件时,请在未合并的路径中重新创建冲突的合并。当从 tree-ish(即使用 --source 选项)检出路径时,不能使用此选项。

--conflict=<style>

与上面的 --merge 选项相同,但会更改冲突块的呈现方式,覆盖 merge.conflictStyle 配置变量。可能的值包括 merge(默认)、diff3zdiff3

--ignore-unmerged

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

--ignore-skip-worktree-bits

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

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

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

--overlay
--no-overlay

在覆盖模式下,恢复时从不删除文件。在非覆盖模式下,删除未出现在 --source=<tree><tree> 中的已跟踪文件,以便使其与 <tree> 完全匹配。默认是非覆盖模式。

--pathspec-from-file=<file>

Pathspec 从 <file> 而不是命令行参数传递。如果 <file>-,则使用标准输入。Pathspec 元素由 LFCR/LF 分隔。Pathspec 元素可以按 core.quotePath 配置变量的解释进行引用(参见 git-config[1])。另请参见 --pathspec-file-nul 和全局 --literal-pathspecs

--pathspec-file-nul

仅在与 --pathspec-from-file 一起使用时有意义。路径规范元素由 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] 套件的一部分