Azure Devops中如何撤销合并的旧提交且不丢失中间的其他提交
操作可行性说明与实现步骤
该需求完全可实现,操作过程不会丢失两次目标提交之间的所有正常提交,操作前建议先备份当前远程分支的最新快照,避免误操作。
前置准备
- 在Visual Studio 2019中打开目标仓库,切换到被污染的目标分支,拉取最新远程代码,保证本地分支状态与远程完全同步。
- 获取两个关键提交的哈希值:
- 10月21日推送的合并提交哈希值(记为
合并提交HASH) - 9月3日生成的未推送旧提交哈希值(记为
旧提交HASH)
可通过VS顶部「Git」菜单→「管理分支」→右键目标分支选择「查看历史记录」,在历史列表中找到对应提交后右键选择「复制提交哈希值」即可获取。
- 10月21日推送的合并提交哈希值(记为
可选操作方案
优先选择方案1,对团队协作的影响最小;如果需要保持提交历史干净、且确认10月21日后的分支更新没有被其他成员拉取过,可选择方案2。
方案1:revert撤销变更(不修改历史,适用绝大多数场景)
revert操作会生成新的提交抵消目标提交的变更,不会改动已有的提交历史,也不会影响中间的正常提交:
- 打开VS内置Git命令行:顶部「Git」菜单→「打开命令提示符」
- 先撤销9月3日的旧提交,执行命令:
git revert <旧提交HASH>,如有冲突按提示完成冲突解决后提交即可。 - 再撤销10月21日的合并提交,执行命令:
git revert -m 1 <合并提交HASH>,其中-m 1表示保留合并的第一个父节点,即合并前远程分支的正常提交线,解决冲突后完成提交。 - 将本地生成的两个revert提交直接push到Azure DevOps远程仓库即可完成操作。
方案2:rebase删除提交(修改历史,适合无其他成员同步过新提交的场景)
该方案会彻底抹除两个目标提交的痕迹,保持提交历史干净:
- 打开VS内置Git命令行,执行命令:
git rebase -i <旧提交HASH>~1 - 在弹出的交互编辑界面中,找到对应
旧提交HASH和合并提交HASH的两行,将行开头的pick修改为drop,保存后退出编辑。 - 操作过程中如果出现冲突,解决冲突后执行
git rebase --continue,直到rebase流程完全结束。 - 由于改动了分支历史,需要强制推送至远程,执行命令:
git push --force-with-lease,该命令会先校验远程是否存在本地未同步的新提交,避免误覆盖其他成员的代码。
Azure DevOps权限说明
如果强制推送时提示权限不足,需要联系仓库管理员在Azure DevOps项目设置→仓库→对应仓库的「安全」配置中,为你的账号开放「强制推送(改写历史)」权限,操作完成后建议及时收回该权限避免后续误操作。
内容的提问来源于stack exchange,提问作者Filip5991
相关产品推荐
相关产品推荐

