这三个命令新手最容易搞混,用错就丢代码。先记住一句话:
reset改历史,revert加新提交抵消,checkout/restore只动工作区。
决策表
| 场景 | 命令 | 会不会改历史 |
|---|---|---|
| 刚 commit,还没 push,想撤销提交但保留改动 | git reset --soft HEAD~1 |
改 |
| 刚 commit,还没 push,提交和改动都不要了 | git reset --hard HEAD~1 |
改(危险) |
| 已经 push 了,想撤回某次提交 | git revert <commit> |
不改 |
| 只改了工作区文件,想丢弃 | git restore <file> / git checkout -- <file> |
不改 |
| 已经 add 到暂存区,想取消 add | git restore --staged <file> |
不改 |
三种 reset 的区别
--soft 只移动 HEAD,改动留在暂存区(可以重新 commit)
--mixed 移动 HEAD + 重置暂存区,改动留在工作区(默认)
--hard 移动 HEAD + 重置暂存区 + 丢弃工作区改动(不可恢复)
--hard 是唯一会丢数据的,用之前先确认工作区干净。
已经 push 了,千万别 reset
你 reset 后强制 push(push -f),同事的本地仓库会和远端分叉,别人一拉代码就炸。公共分支上永远用 revert:
git revert HEAD # 生成一个反向提交,抵消上一次
git revert --no-commit HEAD~3..HEAD # 抵消最近三次,合成一个提交
救回误操作:reflog
reset --hard 之后发现删错了?只要没 GC 就还能救:
git reflog # 找到误操作前的 commit hash
git reset --hard <hash>
reflog 记录 HEAD 的每一次移动,默认保留 90 天,是 Git 的「后悔药」。
实践建议
- 提交前
git diff --staged看一遍再 commit - 怕丢就先
git stash,确认没问题再 drop - 主分支开保护,禁止 force push,从制度上杜绝
常见误区:
checkout在新版 Git 里被拆成switch(切分支)和restore(恢复文件),语义更清晰,建议改用新命令。
楼主 · 2026-09-28 13:21 · 浏览 6

