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