首页/开发/Git 与协作速查/git restore 复原文件与暂存区
Git 基础与命令88 条

git restore 复原文件与暂存区

复原工作区或暂存区:默认丢弃工作区改动,--staged 取消暂存,--source 从历史版本取回内容。

Git 与协作速查开发更新于 2026-10-13

git restore 是什么

git restore 把文件内容或暂存区状态还原到某个版本。Git 2.23 把原来 checkout 承担的两类职责拆开:switch 管切换分支,restore 管还原文件。它的默认行为是用 HEAD 的版本覆盖工作区,也就是丢弃未提交的改动,因此执行前一定要确认还原目标。

两个方向要分清

restore 有两个作用方向:不加参数时只处理工作区,会丢弃本地改动;加 --staged 时只处理暂存区,把内容从暂存区撤下来但保留工作区文件。两者可以组合,git restore --staged --worktree <文件> 会把该文件在两层都还原到 HEAD。加上 --source 还能从任意提交取回内容。

基本信息

适用平台Linux / macOS / Windows(Git 2.23 起)
语法git restore [选项] [--] <路径>
默认方向用 HEAD 版本覆盖工作区,丢弃未提交改动
--staged取消暂存,同时保留工作区内容
-s / --source指定来源提交,例如 HEAD~2
-p交互选择要还原的补丁块

典型使用场景

  • 放弃本地改动:把某个文件恢复成 HEAD 的样子
  • 取消暂存:add 错了文件,撤下来但保留改动
  • 取历史版本:从旧提交里把内容取回来对比或复用
  • 部分还原:用 -p 只还原补丁块中的一部分
  • 两层一起撤销:同时指定 --staged 与 --worktree

常用示例

常用示例
git restore app.py                     # 丢弃工作区改动,恢复为 HEAD 版本
git restore --staged app.py            # 取消暂存,保留工作区内容
git restore --staged --worktree app.py # 两层一起还原到 HEAD
git restore --source HEAD~2 -- app.py  # 从两步之前的提交取回内容
git restore -p -- app.py               # 交互选择要还原的改动块
git status --short                     # 还原后核对状态是否符合预期

方向与结果

写法作用对象结果
git restore <文件>工作区本地改动被丢弃
--staged暂存区取消暂存,文件内容不变
--staged --worktree两层文件完全回到 HEAD
--source <提交>工作区用指定提交的内容覆盖
-p工作区只还原选中的补丁块
丢弃工作区改动的操作不能靠 reflog 找回,因为这些改动从未进入对象库。执行前请确认文件内容确实不需要保留。
未跟踪的文件不能靠 restore 清理:它不在版本库里,没有可还原的版本,需要改用 git clean,并且先加 -n 演练一遍。

易错点

  • restore 默认作用于工作区,容易与 --staged 记反,执行前先用 git status 对齐预期
  • 丢弃工作区改动无法用 reflog 找回,改动从未进入对象库,没有任何兜底路径
  • 未跟踪文件不在版本库中,restore 对它无效,清理必须用 git clean 并先演练
  • 路径写错会把无关文件一起还原,用 -- 分隔路径并确认拼写无误

数据来源与参考

  • Git 官方文档:git-restore
  • Git 2.23 发行说明(restore/switch 引入)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌