开发中难免会遇到提交信息写错、漏提交文件,或者已经提交的代码需要撤销。Git 提供了 reset、revert 和 commit –amend 等命令,但它们的作用并不一样,用错了还可能丢失修改。
1. git commit –amend:修改最近一次提交
如果刚刚提交完,发现提交说明写错了,或者漏掉了一个文件,可以使用 –amend。
# 修改最近一次提交说明
git commit –amend -m "feat: update login"
# 把遗漏的文件加入最近一次提交
git add forgotten-file.java
git commit –amend –no-edit
–no-edit 表示保留原来的提交说明。注意,amend 会生成一个新的提交对象并替换当前分支上的最近一次提交,因此如果旧提交已经推送并被他人使用,就要谨慎操作。
2. git reset:回退提交
reset 常用于调整当前分支指向的提交。常见的三种模式区别在于是否重置暂存区和工作区:
| git reset –soft HEAD~1 | 保留 | 保留 |
| git reset –mixed HEAD~1 | 重置 | 保留 |
| git reset –hard HEAD~1 | 重置 | 重置 |
其中 –mixed 是默认模式。–soft 适合想撤销最近一次提交、但仍准备重新提交的情况;–hard 会丢弃目标提交之后的工作区和暂存区改动,使用前务必确认。
3. git revert:用新提交撤销旧提交
如果某个提交已经推送到共享分支,通常更适合使用:
git revert <commit-id>
它不会直接删除旧提交,而是创建一个新的提交,反向应用指定提交带来的修改。这样可以保留历史记录,避免直接重写共享分支历史。
如果反向修改与后续代码发生冲突,仍然需要手动解决冲突并完成操作。
4. 到底应该用哪个?
- 只想修改最近一次提交说明,或补上漏掉的文件: 使用 git commit –amend。
- 本地提交还没共享,想回退提交并重新整理改动: 使用 git reset,按需选择 –soft、–mixed 或 –hard。
- 提交已经推送到远程共享分支,需要安全撤销: 通常使用 git revert。
特别提醒:reset –hard 有丢失未提交修改的风险;amend 和 reset 可能重写提交历史。操作前先运行 git status,必要时创建备份分支;已经共享的提交,优先考虑 git revert。



