如何撤销已经推送的提交
撤销已推送提交的安全做法是 git revert <哈希>:生成反向提交,不改写历史,push 后对协作者零影响。只有在确认无人拉取过、或个人分支上,才可用 reset + force-with-lease 强推。
共享历史的铁律:不改写,只抵消。 git revert <提交哈希> 生成一个"做相反操作"的新提交,推上去后所有人的 pull 都正常工作。这是已推送提交的标准撤销方式。
标准流程
git revert a1b2c3d # 撤销指定提交
git revert HEAD # 撤销最近一次
git revert --no-commit A..B # 多个提交压成一个撤销提交
git push
什么时候可以用强推
同时满足:① 个人分支;② 确认没人基于它工作;③ 团队知情。此时:
git reset --hard HEAD~1
git push --force-with-lease
撤销合并提交
git revert -m 1 <合并提交>
注意后续重新合并该分支需要额外处理(revert 的 revert 或 rebase 分支)。
撤销后的沟通清单
- 团队频道告知"某个提交已 revert,原因是什么";
- 检查 CI 是否通过;
- 如果该提交已进了发布版本,评估是否需要发补丁版本;
- 复盘:为什么这个提交会进 main——流程上补一道检查。
常见问题(FAQ)
Q:revert 和"删库重跑"比哪个好?
revert。历史可追溯(什么时候错的、什么时候修的、为什么),这是工程团队的宝贵记录。
Q:revert 的提交信息怎么写?
默认会带 "Revert "原信息""。补充一句为什么撤销(如 "导致支付回调 500"),未来的你会感谢现在写清楚的你。
Q:revert 之后发现问题没那么严重,想恢复回来?
git revert <revert提交>(revert 的 revert),改动就回来了。