git restore 用来「把文件恢复到某个来源的样子」:默认从暂存区恢复工作区文件,加 --staged 则从 HEAD 恢复暂存区。它是 Git 2.23 从 git checkout 里拆出来的新命令,职责单一、语义清楚。
本文列出 git restore 支持的常用参数并逐个解说,重点区分 --staged 与 --worktree 两个作用位置。
关于本系列
本文是《Git 使用教程》按命令拆分的第 12 / 28 篇,全部收录在 Git 栏目。参数表列的是日常高频项,并非穷举;想看某个命令的完整参数,用
git restore -h 看精简列表、git help restore 看完整手册。示例以 Git 2.56.0 为准。一、命令语法
先看语法骨架,再对照下一节的参数表。<占位> 表示必填值,实际输入时不要带尖括号;[...] 表示可选项,-- 用来分隔选项与路径。
bash语法
git restore [<options>] [--source=<tree>] [--staged] [--worktree] [--] <pathspec>...
二、参数逐项详解
下表按用途列出 git restore 的常用参数,每项都注明了「它到底改变了什么」。
| 参数 | 作用 |
|---|---|
--worktree / -W | 恢复到工作区;两个位置参数都不写时默认就是它 |
--staged / -S | 恢复到暂存区,等价于老写法 git reset <file>(取消暂存) |
--source=<tree> / -s | 指定来源提交/分支/标签;不写时 --staged 取自 HEAD,否则取自索引 |
-p / --patch | 交互式按 hunk 选择要恢复的部分 |
--ours / --theirs | 冲突时取第 2 / 第 3 阶段(本方 / 对方)内容 |
-m / --merge | 在工作区重建冲突标记,用于重新处理冲突 |
--conflict=<风格> | 冲突标记风格:merge、diff3、zdiff3 |
--ignore-unmerged | 遇到未合并条目不中止,保留工作区现状 |
--overlay / --no-overlay | 恢复时不删除多余文件 / 严格对齐来源树(默认) |
--recurse-submodules | 同时更新子模块工作区 |
-q / --quiet | 静默,抑制反馈信息 |
-- | 分隔选项与路径 |
两个作用位置怎么组合
| 命令 | 效果 |
|---|---|
git restore <file> | 丢掉工作区改动,暂存区不动 |
git restore --staged <file> | 取消暂存,工作区改动保留 |
git restore --source=HEAD --staged --worktree . | 暂存区与工作区一起回到 HEAD |
三、常用示例
最常见的三种撤销
bash最常见的三种撤销
git restore src/app.js # 丢掉本地修改
git restore --staged src/app.js # 取消暂存
git restore . # 丢掉当前目录所有本地修改
从历史版本取回文件
bash从历史版本取回文件
git restore --source=HEAD~2 -- README.md
git restore --source=main -- src/config.js
git restore --source=v1.2.0 --staged --worktree .
短写与交互式恢复
bash短写与交互式恢复
git restore -SW . # --staged + --worktree
git restore -s@ -SW . # @ 是 HEAD 的简写
git restore -p src/order.js # 逐块选择要丢掉的改动
四、注意事项
restore 不经过回收站
git restore <file> 会用索引里的内容直接覆盖工作区文件,未暂存的改动就此消失且不会进 reflog。没把握时先 git stash push -m "备份",或者用 -p 逐块确认。版本提示:
git restore 与 git switch 都是 Git 2.23+ 才有的。老环境里对应写法是 git checkout -- <file> 和 git reset HEAD <file>。五、小结
把 restore 理解成「从哪来(--source)恢复到哪一格(--staged / --worktree)」就不会用错。它只动文件,不动提交历史;需要改的是提交本身时,应该换 git reset 或 git revert。
本系列共 28 篇,一个命令一篇,完整目录见 Git 栏目。下一篇:git reset 命令参数详解。