Git的撤销操作
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 | # ✅ Git 2.23+ 推荐新命令(语义清晰,不会和切换分支混淆) |
⚠️ 注意:这个操作会直接丢弃工作区的修改,无法恢复,执行前确认不需要这些改动了!
🔹 场景2:已经 git add 到暂存区,但还没 commit
不小心把不该提交的文件add了,或者add后想修改代码,先把暂存区的修改撤回来:
1 | # ✅ 第一步:把暂存区的文件撤回到工作区(文件内容不变,只是退出暂存区) |
🔹 场景3:已经 git commit,但还没推送到远程
提交后发现提交错了,或者提交说明写错了,这时候还没推给别人,可以修改本地提交历史:
① 只想修改最近一次提交的说明/补充内容
1 | # 编辑提交说明,或者补充遗漏的文件(会替换掉上一次提交) |
适合:提交说明打错字了、漏add了一个文件,不用生成新的提交。
② 撤销提交,保留所有代码(最常用)
1 | # 撤销上一次提交,代码还在工作区,暂存区也保留(相当于没执行过commit) |
适合:提交内容错了,想修改代码后重新提交。
③ 撤销提交+撤销add,保留代码
1 | # 等价于 git reset HEAD~1(默认就是--mixed模式) |
效果:提交撤销了,add也撤销了,代码还在工作区,可以重新修改+add+commit。
④ 彻底撤销提交,丢弃所有代码(⚠️ 谨慎)
1 | git reset --hard HEAD~1 |
效果:上一次提交完全消失,所有修改直接删除,无法恢复!
🔹 场景4:已经推送到远程仓库(公共分支)
❌ 绝对禁止用 git reset --hard!会修改远程历史,导致所有协作者的本地代码冲突混乱。
✅ 正确做法:用 git revert 生成新的提交,反向撤销之前的修改,不破坏历史:
1 | # 1. 先找到要撤销的提交哈希(git log --oneline 查看) |
二、其他常见撤销场景
1. 撤销合并(merge冲突了,想放弃合并)
1 | git merge --abort |
合并到一半出现冲突,不想解决了,回到合并前的状态。
2. 撤销变基(rebase过程中出错)
1 | git rebase --abort |
3. 撤销暂存的修改(git stash 相关)
1 | # 恢复最近一次stash的修改,并删除stash记录 |
4. 撤销刚才的 git pull
拉取远程代码后发现有问题,想回到pull之前的状态:
1 | git reset --hard ORIG_HEAD |
⚠️ 新手必看的安全原则
- 只要没执行
git reset --hard,几乎所有修改都能找回,不用慌 - 公共分支(别人也在拉的分支)永远不要修改历史:只用
git revert,不用git reset - 不确定操作后果时,先执行
git stash把当前代码存起来,就算操作错了也能恢复
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Mount256的个人小站!



