簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-restore 最後更新於 2.50.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 模式。

-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 (預設)、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>

路徑規範透過 <file> 傳遞而不是命令列引數。如果 <file> 恰好是 -,則使用標準輸入。路徑規範元素透過 LFCR/LF 分隔。路徑規範元素可以像配置變數 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 .

或者使用 top 路徑規範魔術恢復所有工作區檔案(參閱 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