git reset --soft HEAD~1可撤回刚提交但未推送的记录,仅回退HEAD指针,保留所有修改在暂存区,支持直接修正提交信息或补加文件后重提。

git reset --soft HEAD~1 能撤回提交但保留修改
刚 git commit 完,还没 git push,想把这次提交抹掉但不想丢代码——用 git reset --soft HEAD~1 最直接。它只把 HEAD 指针往回拨一格,暂存区(index)和工作目录全都不动,相当于“提交没发生过”,但所有改动还在暂存区里,你可以改完 commit -m 重新提交。
常见错误:误用 --hard,会直接清空工作目录修改,代码就真没了;或者写成 HEAD^(少个波浪号),在某些 shell 里会被当成命令替换而报错。
-
HEAD~1和HEAD^多数情况等价,但HEAD~n更明确、更安全,尤其在脚本里 - 如果已经
git push过,不能直接reset,否则会强制覆盖远程历史,队友拉代码时会出错 - 执行后用
git status看一眼,应该显示 “Changes to be committed”,说明成功了
git commit --amend 替换上一次提交(含消息或文件)
不是要删提交,而是发现刚提交的 message 写错了,或者漏加了一个文件?git commit --amend 是更轻量的选择。它用新提交完全替代上一个,SHA-1 值会变,但逻辑上是“修正”而非“删除”。
注意:如果已经推送到远程,--amend 后必须用 git push --force-with-lease 强推,不能用 --force(太危险),且仅限你一个人用的分支。
- 改提交信息:直接
git commit --amend,会打开编辑器让你重写commit -m - 补文件:先
git add,再git commit --amend --no-edit(避免弹编辑器) - 如果上一次提交已包含多个文件,
--amend会把暂存区当前所有内容都塞进去,别忘了检查git status
git revert HEAD 创建反向提交(适合已推送场景)
代码已经 git push 到远程,又不能强制覆盖——这时 git revert HEAD 是唯一安全做法。它不删历史,而是在当前分支新增一个“抵消上次提交”的提交,Git 日志里能看到两条记录:原提交 + revert 提交。
仅从仓库的暂存文件生成 Git 提交消息。当用户要求 Codex 根据暂存更改、缓存差异、Git 索引或已通过 `git add` 添加的文件来编写、起草、创建或建议提交消息时使用;切勿代表用户执行提交操作。
这是团队协作中唯一被广泛接受的“撤回”方式,因为不破坏提交线性,也不影响别人已拉取的历史。
- 执行后会生成一个新提交,message 默认是
Revert "xxx",可手动编辑 - 如果要 revert 的是合并提交(merge commit),得加
-m 1指定主分支父节点,否则 Git 不知道该倒退回哪条线 -
revert可能冲突:比如你 revert 的提交改了某行,之后别人又改了同一行,就得手动解决
撤回后怎么确认是否生效
别只信命令输出,一定要手动验证。最可靠的是三步检查法:
- 看日志:
git log --oneline -n 5,确认 HEAD 已回到目标位置,或新增了 revert 提交 - 看状态:
git status,区分是“干净”、“有未暂存修改”还是“有暂存但未提交” - 看差异:
git diff HEAD~1 HEAD(对 reset)或git show(对 revert),确认内容确实被撤销
最容易被忽略的是:reset 或 amend 后忘记重新 push,或者 revert 后没 push,导致远程分支还是旧状态。只要没 git push,别人就看不到你的“撤回”。










