Git 丢弃工作区已跟踪改动指南
什么时候用
当你修改了已经被 Git 跟踪的文件,但还没有执行 git add,现在想放弃这些工作区改动时使用。
这一页只讨论“已跟踪文件的未暂存改动”。
- 不处理未跟踪文件。
- 不处理已暂存改动。
- 不改写提交历史。
先判断当前状态
git status --short
git diff
git diff <file>
git status --short先看哪些文件还在工作区修改状态。git diff再决定这些 改动是不是确实要丢弃。
推荐命令
| 场景 | 推荐命令 | 结果 |
|---|---|---|
| 恢复单个文件 | git restore <file> | 丢弃该文件的未暂存改动 |
| 恢复多个文件 | git restore file1 file2 | 批量丢弃多个文件的未暂存改动 |
| 恢复当前目录全部已跟踪改动 | git restore . | 丢弃当前目录及子目录下的未暂存改动 |
| 交互式恢复部分内容 | git restore -p <file> | 只丢弃选中的部分改动 |
常见场景
丢弃单个文件的工作区改动
git diff app.js
git restore app.js
丢弃多个文件的工作区改动
git restore app.js style.css index.html
丢弃当前目录下全部已跟踪改动
git restore .
文件已经暂存过,想连暂存一起撤销
git restore --staged app.js
git restore app.js
如果你确认要一次性撤销暂存区和工作区改动,也可以使用:
git restore --source=HEAD --staged --worktree app.js
兼容写法
旧写法通常是:
git checkout -- app.js
git checkout .
它们仍然可用,但 git checkout 同时承担“切换分支”和“恢复文件”两种职责,语义更容易 混淆。新项目更推荐 git restore。
风险与边界
- 这类命令只影响已跟踪文件的未暂存改动。
- 未跟踪文件不会被删除;如果你要清理它们,应该看 清理未跟踪文件。
- 已暂存改动不会被这页的基础命令取消;如果你要撤销
git add,应该看 撤销git add。 - 如果你还不确定要不要丢弃,先用
git stash暂存现场 会更稳妥。
相关命令
git status --short
git restore --staged <file>
git clean -nd
git stash push -u -m "wip"