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 演练一遍。