Git回滚main分支已推送合并提交至指定版本并保留历史
回滚已合并入远程main分支提交的操作指南
针对你无main分支直接推送权限、需通过特性分支提PR合入的约束,全程使用git revert生成反向提交实现回滚,不会改写公共分支历史,最终代码状态会和目标提交4c93166完全一致,操作步骤如下:
1. 同步本地仓库状态
先把本地main分支更新到和远程main完全一致:
git checkout main git pull origin main
2. 创建回滚专用特性分支
基于最新的main分支创建用于提PR的特性分支,如果你本地已经有revert-databricks-install分支可以直接切换使用:
git checkout -b revert-databricks-install
3. 按从新到旧的顺序回滚两个合并提交
合并提交的回滚必须加-m 1参数,指定保留main主线的提交历史、撤销合入PR带来的变更,必须先回滚更新的提交,再回滚更早的提交,顺序颠倒会产生大量冗余冲突:
- 先回滚最新的合并提交
c4f28ad(PR3973的合并提交):
如果执行过程中提示冲突,手动解决冲突文件后,执行git revert -m 1 c4f28adgit add <冲突文件路径>,再运行git revert --continue完成本次回滚。 - 再回滚更早的合并提交
aa68a82(databricks驱动安装PR的合并提交):
同样按提示处理可能出现的冲突,完成回滚流程。git revert -m 1 aa68a82
4. 验证回滚结果
执行以下命令对比当前分支和目标提交4c93166的文件差异:
git diff 4c93166
如果命令没有任何输出,说明当前分支的代码状态已经和4c93166完全一致,回滚符合预期。
5. 推送分支提交PR
将本地完成回滚的特性分支推送到远程仓库:
git push origin revert-databricks-install
之后在仓库的代码托管页面正常创建PR,目标分支选择main,在PR描述中说明本次变更为回滚c4f28ad、aa68a82两个合并提交,将代码恢复到4c93166对应的状态,走正常代码评审流程合入即可。
避坑说明
- 禁止使用
git reset --hard加强制推送的方式修改main分支,该操作会改写公共提交历史,影响所有协作者的本地仓库,且保护分支通常会直接禁止强制推送,操作无法生效。 - 回滚合并提交时必须携带
-m 1参数,否则Git会抛出错误,无法识别需要保留哪条分支线的历史。 - 回滚顺序不可颠倒,必须从最新的提交往旧提交依次回滚,否则会出现大量不必要的冲突处理工作。
内容的提问来源于stack exchange,提问作者Buggy B
相关产品推荐
相关产品推荐

