跳到主要内容

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"