Skip to content

撤销工作区

概述

工作区修改的撤销是 Git 日常使用中最常见的操作之一。本节将介绍如何撤销工作区中的修改,恢复文件到之前的状态。

git restore 撤销修改

git restore 是 Git 2.23+ 引入的新命令,专门用于恢复文件。

基本用法

bash
# 撤销工作区中指定文件的修改
git restore <file>

# 撤销多个文件的修改
git restore file1.txt file2.txt

# 撤销当前目录下所有文件的修改
git restore .

# 撤销指定目录下所有文件的修改
git restore src/

恢复到特定版本

bash
# 恢复到 HEAD 版本(默认)
git restore file.txt

# 恢复到上一次提交
git restore --source=HEAD file.txt

# 恢复到指定提交
git restore --source=a1b2c3d file.txt

# 恢复到暂存区版本
git restore --source=index file.txt

# 恢复到远程分支版本
git restore --source=origin/main file.txt

撤销部分修改

bash
# 交互式选择要撤销的修改
git restore -p file.txt

# 或使用 --patch
git restore --patch file.txt

常用选项

bash
# 同时撤销工作区和暂存区
git restore --worktree --staged file.txt

# 只撤销工作区(默认)
git restore --worktree file.txt

# 指定源版本
git restore --source=HEAD~2 file.txt

# 强制执行(忽略警告)
git restore -f file.txt

git checkout 撤销文件

git checkout 是传统的撤销文件修改命令,功能较多。

基本用法

bash
# 撤销工作区中指定文件的修改
git checkout -- file.txt

# 撤销多个文件
git checkout -- file1.txt file2.txt

# 撤销当前目录
git checkout -- .

恢复特定版本

bash
# 恢复到 HEAD 版本
git checkout HEAD -- file.txt

# 恢复到上一次提交
git checkout HEAD~1 -- file.txt

# 恢复到指定提交
git checkout a1b2c3d -- file.txt

# 恢复到远程分支版本
git checkout origin/main -- file.txt

注意事项

bash
# 注意 -- 的重要性
git checkout file.txt     # 可能切换分支(如果有同名分支)
git checkout -- file.txt  # 明确表示撤销文件修改

# 建议使用 git restore 替代
git restore file.txt      # 更清晰,不会混淆

撤销所有修改

撤销所有工作区修改

bash
# 方法 1:使用 git restore
git restore .

# 方法 2:使用 git checkout
git checkout -- .

# 方法 3:使用 git reset
git reset --hard HEAD

# 方法 4:使用 git restore(指定所有文件)
git restore :/

撤销特定类型文件

bash
# 撤销所有 .js 文件
git restore "*.js"

# 撤销 src 目录下所有文件
git restore src/

# 撤销所有新增文件(保留修改的文件)
git clean -fd

撤销新增文件

bash
# 删除所有未跟踪的文件
git clean -f

# 删除所有未跟踪的文件和目录
git clean -fd

# 同时删除被忽略的文件
git clean -fdx

# 预览将要删除的文件(不实际删除)
git clean -fd --dry-run

撤销场景示例

场景 1:撤销单个文件的修改

bash
# 查看修改
git status
# modified:   src/main.js

# 撤销修改
git restore src/main.js

# 确认撤销
git status
# nothing to commit, working tree clean

场景 2:撤销部分修改

bash
# 文件有多处修改,只想撤销部分
git restore -p src/main.js

# 交互式界面:
# y - 撤销此块修改
# n - 保留此块修改
# q - 退出
# a - 撤销此文件剩余所有修改
# d - 保留此文件剩余所有修改

场景 3:撤销误删文件

bash
# 误删了文件
rm src/main.js

# 恢复文件
git restore src/main.js

# 或
git checkout HEAD -- src/main.js

场景 4:恢复到特定版本

bash
# 查看提交历史
git log --oneline
# a1b2c3d Fix bug
# b2c3d4e Add feature
# c3d4e5f Initial commit

# 恢复文件到指定提交
git restore --source=b2c3d4e src/main.js

# 文件已恢复到 b2c3d4e 版本,但仍在工作区
# 需要重新提交
git add src/main.js
git commit -m "Restore main.js to b2c3d4e"

场景 5:撤销所有未提交的修改

bash
# 撤销所有修改(包括暂存区)
git restore .
git restore --staged .

# 或一步完成
git reset --hard HEAD

# 清理未跟踪文件
git clean -fd

撤销前的安全措施

查看将要撤销的内容

bash
# 查看工作区修改
git status

# 查看具体修改内容
git diff

# 查看将要恢复的内容
git diff HEAD -- file.txt

备份当前修改

bash
# 方法 1:创建临时分支
git branch backup-branch

# 方法 2:暂存修改
git stash

# 方法 3:创建补丁文件
git diff > changes.patch

# 恢复时
git stash pop
# 或
git apply changes.patch

restore vs checkout 对比

bash
# 撤销工作区修改
git restore file.txt          # 新命令,推荐
git checkout -- file.txt      # 旧命令

# 恢复到特定版本
git restore --source=HEAD~1 file.txt  # 新命令
git checkout HEAD~1 -- file.txt       # 旧命令

# 撤销暂存区
git restore --staged file.txt         # 新命令
git reset HEAD file.txt               # 旧命令

# 同时撤销工作区和暂存区
git restore --staged --worktree file.txt

常见问题

撤销后想恢复

bash
# 如果撤销了工作区修改,修改已丢失
# 除非之前有备份或暂存

# 检查 stash
git stash list

# 检查 IDE 的本地历史(如果有)

部分文件撤销失败

bash
# 可能原因:文件权限问题
git restore -f file.txt

# 可能原因:文件被锁定
# 关闭占用文件的程序后重试

撤销冲突文件

bash
# 合并冲突时撤销文件
git checkout --ours file.txt      # 使用当前分支版本
git checkout --theirs file.txt    # 使用被合并分支版本
git restore --ours file.txt       # 新命令
git restore --theirs file.txt     # 新命令

总结

  • git restore 是撤销修改的推荐命令
  • git checkout -- 是传统的撤销方式
  • 撤销前先确认修改内容
  • 重要修改先备份再撤销
  • 使用 git clean 清理未跟踪文件

下一步

学习完撤销工作区后,建议继续学习: