Git 的撤销操作完全取决于你的修改处于哪个阶段,不同阶段对应不同命令,我按「从新手最常遇到到进阶场景」整理,附快速对照表和注意事项:


📌 快速场景对照表(遇到问题先看这个)

修改处于什么阶段 推荐命令 效果说明
只改了文件,还没执行 git add git restore 文件名 丢弃工作区修改,文件回到上次提交状态
已经 git add,但还没 git commit 1. git restore --staged 文件名
2. (可选)git restore 文件名
1. 先从暂存区撤回工作区
2. 彻底丢弃修改
已经 git commit,但还没推到远程 git reset --soft HEAD~1(保留代码)
git reset --hard HEAD~1(彻底丢弃)
撤销提交,按需保留/丢弃代码
已经推送到远程仓库(公共分支) git revert 提交哈希 生成新提交撤销旧提交,不修改历史(安全)

一、最常用:分阶段详细操作

🔹 场景1:工作区修改,还没 git add(只改了文件,没暂存)

这是新手最常遇到的场景:改了代码,发现改错了,想回到改之前的状态。

1
2
3
4
5
6
7
8
9
10
# ✅ Git 2.23+ 推荐新命令(语义清晰,不会和切换分支混淆)
# 撤销单个文件的修改
git restore index.html

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

# 📌 传统兼容命令(所有Git版本都支持)
git checkout -- index.html
git checkout .

⚠️ 注意:这个操作会直接丢弃工作区的修改,无法恢复,执行前确认不需要这些改动了!


🔹 场景2:已经 git add 到暂存区,但还没 commit

不小心把不该提交的文件add了,或者add后想修改代码,先把暂存区的修改撤回来:

1
2
3
4
5
6
# ✅ 第一步:把暂存区的文件撤回到工作区(文件内容不变,只是退出暂存区)
git restore --staged index.html
# 传统命令:git reset HEAD index.html

# 📌 第二步(可选):如果要彻底丢弃修改,再执行工作区撤销
git restore index.html

🔹 场景3:已经 git commit,但还没推送到远程

提交后发现提交错了,或者提交说明写错了,这时候还没推给别人,可以修改本地提交历史:

① 只想修改最近一次提交的说明/补充内容

1
2
# 编辑提交说明,或者补充遗漏的文件(会替换掉上一次提交)
git commit --amend

适合:提交说明打错字了、漏add了一个文件,不用生成新的提交。

② 撤销提交,保留所有代码(最常用)

1
2
# 撤销上一次提交,代码还在工作区,暂存区也保留(相当于没执行过commit)
git reset --soft HEAD~1

适合:提交内容错了,想修改代码后重新提交。

③ 撤销提交+撤销add,保留代码

1
2
# 等价于 git reset HEAD~1(默认就是--mixed模式)
git reset --mixed HEAD~1

效果:提交撤销了,add也撤销了,代码还在工作区,可以重新修改+add+commit。

④ 彻底撤销提交,丢弃所有代码(⚠️ 谨慎)

1
git reset --hard HEAD~1

效果:上一次提交完全消失,所有修改直接删除,无法恢复!


🔹 场景4:已经推送到远程仓库(公共分支)

绝对禁止用 git reset --hard!会修改远程历史,导致所有协作者的本地代码冲突混乱。
✅ 正确做法:用 git revert 生成新的提交,反向撤销之前的修改,不破坏历史:

1
2
3
4
5
6
# 1. 先找到要撤销的提交哈希(git log --oneline 查看)
# 2. 执行撤销,生成新提交
git revert a1b2c3d

# 3. 推送到远程即可
git push

二、其他常见撤销场景

1. 撤销合并(merge冲突了,想放弃合并)

1
git merge --abort

合并到一半出现冲突,不想解决了,回到合并前的状态。

2. 撤销变基(rebase过程中出错)

1
git rebase --abort

3. 撤销暂存的修改(git stash 相关)

1
2
3
4
5
6
7
8
# 恢复最近一次stash的修改,并删除stash记录
git stash pop

# 恢复stash但保留stash记录
git stash apply

# 丢弃最近一次stash
git stash drop

4. 撤销刚才的 git pull

拉取远程代码后发现有问题,想回到pull之前的状态:

1
git reset --hard ORIG_HEAD

⚠️ 新手必看的安全原则

  1. 只要没执行 git reset --hard,几乎所有修改都能找回,不用慌
  2. 公共分支(别人也在拉的分支)永远不要修改历史:只用 git revert,不用 git reset
  3. 不确定操作后果时,先执行 git stash 把当前代码存起来,就算操作错了也能恢复