误用了 git commit --amend 怎么撤销
撤销 amend:git reflog 找到 amend 前的提交哈希,git reset --soft <原提交哈希> 即可恢复。amend 只是生成了新提交,恢复依赖本地 reflog 和提交对象仍保留,不保证固定30天内随时可回。
别慌,amend 是可逆的:amend 本质是"生成新提交替换旧提交",旧提交对象尚未回收时可以恢复。用 git reflog 找到 amend 之前的提交哈希,git reset --soft <旧哈希> 即可把分支拨回去。
恢复步骤
git reflog
# 找到类似这样的记录:
# b2c3d4e HEAD@{0}: commit (amend): 你的新信息
# a1b2c3d HEAD@{1}: commit: 原来的提交信息 ← 这就是 amend 前
git reset --soft a1b2c3d
--soft 把分支拨回原提交,索引与工作区保持不变(若 amend 后没有再改动,amend 带进来的差异会留在暂存区)——你可以选择:
- 想要 amend 的改动单独成新提交:
git commit -m "..."; - 不想要那些改动:先检查
git diff与git diff --cached,再针对要丢弃的路径执行git restore --staged -- <路径>和git restore -- <路径>;会丢弃这些路径的未提交改动。
场景变体
- amend 改错了信息:不用再 reset,直接
git commit --amend --only -m "正确信息"再修一次; - amend 误吞了别人的提交内容:reflog 找到对方提交哈希,reset --soft 回去后重新整理;
- 已推送后的 amend:先比较远端;只有远端也包含待改写历史且团队同意时才考虑
--force-with-lease,不必一律强推。
常见问题(FAQ)
Q:amend 多次之后 reflog 里一堆记录怎么找?
看提交信息列和动作类型(commit (amend) vs commit),按时间定位目标 amend 的前一状态,并用 git show <哈希> 核对内容;目标也可能是前一次 amend,不能机械选最后一个非 amend 记录。
Q:reflog 能看多久?
记录保留受一般条目、不可达条目和对象回收配置共同影响,不存在保证的恢复窗口。尽快找到旧提交并建立分支引用。
Q:想避免误 amend?
IDE 的提交按钮和命令行分开用;amend 前 git log -1 确认最近提交确实是自己的。