Appearance
撤销工作区
概述
工作区修改的撤销是 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.txtgit 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.patchrestore 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清理未跟踪文件
下一步
学习完撤销工作区后,建议继续学习:
