Git 中文手册

git 撤销最后一次 commit 的 3 种方法(保留/删除/丢弃改动)

2026-09-06 约 3 分钟阅读

忘记提交了不想提交的文件、或提交信息写错、或想彻底撤销最后一次 commit?本文用 3 个真实场景讲清 git reset、git revert、git commit --amend 的区别与用法。

场景:你刚刚执行了 git commit,却立刻发现——要么多了不该提交的文件,要么提交信息打错了,要么连改动都想放弃。别慌,下面 3 种方法覆盖全部情况。

方法一:只想改提交信息(改动保留)

如果文件提交对了,只是 commit 描述文字打错或想补充,用 --amend:

git commit --amend -m "修正后的提交信息"

它不会新增提交记录,而是把「上一次提交」原地改写。适用于提交信息笔误、漏了作者、或想并入一个小改动:

git add 漏掉的文件.txt
git commit --amend --no-edit   # 保留原提交信息,把新改动并入

方法二:撤销提交但保留工作区改动(最常用)

如果提交进去了,但你后悔提交、想退回暂存前/工作区状态继续改,用 git reset:

git reset --soft HEAD~1     # 撤销提交,改动留在暂存区(绿色)
git reset HEAD~1            # 撤销提交,改动退回工作区(未暂存)
git reset --hard HEAD~1     # 撤销提交,并丢弃全部改动(危险!)
  • --soft:代码仍「已暂存」,适合只是提交时机不对
  • 默认(mixed):代码回到「未暂存」,最常用
  • --hard:彻底删除改动,恢复成上一个提交,无法找回,慎用

方法三:提交已推送到远程(用 revert 而非 reset)

如果这个 commit 已经 git push 到远程、且可能被同事拉取过,不要用 reset(会改历史、导致别人 pull 冲突)。应新增一个「反做」提交:

git revert HEAD            # 生成一个新提交,内容等于撤销上一次改动
git push                   # 正常推送,不动历史

revert 的优点是不改写历史,适合团队协作;缺点是会多一条提交记录。

常见报错与提示

  • 提示 HEAD~1 不存在:表示当前分支还没有可撤销的上一提交(比如只有一个初始 commit),用 git log --oneline 确认提交序号。
  • reset 后想找回改动:若没加 --hard,改动还在工作区;若加了 --hard,可尝试 git reflog 找回。

一句话速记

  • 只想改信息 → --amend
  • 没推送、想退回 → git reset
  • 已推送、团队在用 → git revert
?

常见问题 FAQ

git reset --hard 会把改动彻底删掉吗?还能找回吗?
会丢掉工作区和暂存区的改动,但提交历史仍在。可用 git reflog 找到被 reset 前的提交哈希,再用 git reset --hard 提交哈希 找回。
git revert 和 git reset 到底有什么区别?
reset 是移动分支指针回到过去的提交,会改写历史,适合未推送的提交;revert 是新增一个"反向提交"来抵消改动,不改写历史,适合已推送到远程、别人可能拉取的提交。
commit 已经 push 到 GitHub 了,还能撤销吗?
可以但别用 reset(会破坏远程历史导致协作者冲突),正确做法是用 git revert HEAD 生成一个反做提交后再 push。
我忘了 --amend 会影响之前的多个提交吗?
不会,amend 只修改最近一次提交(HEAD),不会影响更早的历史。
撤销到某一个历史版本,怎么找到那个提交?
用 git log --oneline 查看提交列表,找到目标提交的哈希(如 abc1234),然后 git reset abc1234 回到该版本。