📢 欢迎来到万事技术论坛!本站仅讨论合法编程技术话题,严禁外挂/作弊/黑产/盗版内容,违者封号。

精华Git 提交错了怎么撤销?reset / revert / checkout 一张表搞清

yuki 进阶会员

这三个命令新手最容易搞混,用错就丢代码。先记住一句话:

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 的「后悔药」。

实践建议

  1. 提交前 git diff --staged 看一遍再 commit
  2. 怕丢就先 git stash,确认没问题再 drop
  3. 主分支开保护,禁止 force push,从制度上杜绝

常见误区:checkout 在新版 Git 里被拆成 switch(切分支)和 restore(恢复文件),语义更清晰,建议改用新命令。

楼主 · 2026-09-28 13:21 · 浏览 6
登录 后即可参与回复。