为什么用 revert 而不是 reset
git reset --hard 会重写分支历史,迫使每个协作者恢复。git revert 新增一个反向提交,分支保持只追加,审计记录同时保留错误和修正。
git log --oneline -5
git revert --no-edit 4f3c2a1
git push origin main
步骤
- 用
git log --oneline -10确认要撤销的提交及其内容。 - 执行
git revert --no-edit <commit-sha>。如果需要一次撤销多个提交,或冲突需要人工编辑,使用--no-commit。 - 运行相关测试并检查 diff,确认只改变预期行为。
- 正常推送 revert 提交,不要对共享分支强制推送。
验证
git log在原始提交之后显示新的Revert "..."提交。- 原始提交修改的文件恢复到之前的内容。
- 撤销后的分支测试通过。
git status干净,远程分支同时包含原始提交和撤销提交。
常见问题
如果 revert 报告冲突,解决文件、暂存后执行 git revert --continue;冲突通常意味着后续提交依赖被撤销的代码。如果要撤销的是合并提交,使用 git revert -m 1 <merge-sha>,并确认哪个父提交代表主线。
限制
revert 不修复根因,应另开一个修正实现。它也会在历史中保留原始提交,因此不适合处理安全事件中的敏感数据;此类情况需要重写历史并轮换凭据。