背景生产环境代码master分支预发PRE或验证UAT分支代码release分支测试代码test分支。新需求来了以后从master分支切出feature_abc,经过自测后从feature_abc推送到test分支没问题后再从feature_abc提交到release分支最后从feature_abc到master分支。假如某位开发不小心【将release分支merge into了自己的feature_abc分支】1️⃣那么上线的时候feature_abc分支可能同时把别人的代码也上线了。所以得1出的操作回退。解决方案Git Revert Merge 提交完整指南一、原理说明1. Merge 提交的特殊性当执行git merge时Git 会创建一个特殊的合并提交Merge Commit它有两个父节点parent第一个父节点parent 1当前分支的最后一个提交第二个父节点parent 2被合并分支的最后一个提交2. Revert Merge 的核心逻辑git revert用于撤销指定提交的代码变更但对于 merge 提交需要额外指定保留哪个父分支的代码。-m 1保留当前分支parent 1的代码撤销来自被合并分支的变更-m 2保留被合并分支parent 2的代码撤销当前分支的变更3. Revert 的优势✅不修改历史不会删除或改写已有提交✅安全协作不会影响其他开发者的工作✅可追溯创建新提交记录撤销操作便于审计二、具体步骤和命令步骤 1定位要撤销的Merge Commit# 查看提交历史找到目标 merge commitgitlog--oneline--graph-20输出示例* 35a309922 (HEAD - feature_abc) Merge branches release into feature_abc |\ | * abc123456 (release) feat: some feature from release * | def789012 feat: my feature work |/记录下merge commit的 hash35a309922步骤 2执行 Revert 操作# 撤销 merge保留当前分支-m 1的代码gitrevert-m1merge-commit-hash示例gitrevert-m135a309922步骤 3编辑提交信息执行后会进入 Vim 编辑器按以下操作编辑提交信息可选默认已生成按Esc退出编辑模式输入:wq保存并退出步骤 4处理冲突如有如果出现冲突Git 会提示# 查看冲突文件gitstatus# 编辑冲突文件手动解决冲突# 标记冲突已解决gitadd冲突文件# 完成提交gitcommit步骤 5验证结果# 查看提交历史确认 revert 提交已创建gitlog--oneline-5# 查看具体变更gitshow HEAD步骤 6推送到远程gitpush originbranch-name三、完整示例流程# 1. 切换到目标分支gitcheckout feature_abc# 2. 查看提交历史找到 merge commitgitlog--oneline--graph-10# 3. 执行 revert假设 merge commit hash 是 35a309922gitrevert-m135a309922# 4. 在 Vim 中按 Esc :wq 保存退出# 5. 验证gitlog--oneline-3gitstatus# 6. 推送gitpush origin feature_abc四、关键参数说明参数说明-m 1保留第一个父分支当前分支的代码-m 2保留第二个父分支被合并分支的代码--no-edit使用默认提交信息跳过编辑步骤--no-commit只应用变更不自动提交五、常见问题与解决Q1revert 后想撤销 revert 怎么办# 找到 revert 提交的 hash再 revert 一次gitrevertrevert-commit-hashQ2revert 时出现冲突按常规冲突解决流程编辑冲突文件 →git add→git commitQ3如何确认哪个是 parent 1# 查看 merge commit 的详细信息gitshowmerge-commit-hash输出中parent 1就是当前分支parent 2是被合并分支。六、总结操作命令查找 merge commitgit log --oneline --graph执行 revertgit revert -m 1 hash编辑提交信息Esc :wqVim验证结果git log/git status推送到远程git push origin branch核心要点git revert -m 1是撤销 merge 最安全的方式它保留历史、不影响协作是团队开发中的最佳实践。