合并冲突未显示:dev分支合并到master时代码被覆盖删除
解决Development分支合并到Master时代码被覆盖/文件丢失的问题
嘿,我碰到过好几次这种因为回滚操作搞乱分支历史的情况,你的问题核心是master分支的回滚导致Git的合并逻辑判断出错——它误以为回滚后的旧版本才是“最新正确状态”,直接把dev的新代码覆盖甚至删了。别慌,咱们一步步来搞定:
第一步:先做备份!(绝对不能省)
在动手修改分支之前,先给master和dev各建个备份分支,万一操作崩了还能一键恢复:
# 备份master git checkout master git branch master_backup # 备份dev git checkout dev git branch dev_backup
第二步:先搞懂分支历史到底怎么回事
先看看两个分支的提交图谱,搞清楚分叉点和回滚操作的位置,输入这条命令:
git log --graph --oneline master dev
你会看到master在提交e(回滚操作)之后,回到了误合并之前的状态;而dev一直在正常推进,包含提交f及之后的所有新代码。Git之所以会覆盖dev的代码,是因为它把master回滚后的旧提交当成了“基准”,觉得dev的那些变更已经被“撤销”了。
接下来分两种情况解决,取决于你当初是用哪种方式回滚的:
情况1:当初用git reset --hard回滚的(改写了master的历史)
如果是用reset硬回滚,master的提交历史直接跳回了误合并之前,这时候咱们可以用rebase把dev的所有有效变更“移植”到master上:
- 切换到master分支:
git checkout master
- 执行rebase,把dev的提交重放到master的当前HEAD上:
git rebase dev
如果遇到冲突,别慌——逐个打开冲突文件,把dev的新代码保留下来,然后执行:
git add <处理好的冲突文件> git rebase --continue
等rebase完成后,master就会包含dev的所有新代码,同时保留回滚后的干净状态。
情况2:当初用git revert回滚的(生成了撤销提交e)
如果是用revert生成了一个新的撤销提交,那master的历史里有一个“抵消误合并”的提交,这时候合并dev时要告诉Git优先保留dev的内容:
- 切换到master分支:
git checkout master
- 执行合并,指定冲突时采用dev的代码:
git merge dev -X theirs
合并完成后,一定要仔细检查文件,确保被删除的文件回来了,新代码也都在。
第三步:验证合并结果,别着急推远程
合并完别急着推到远程,先做这几件事:
- 用
git status看看有没有文件丢失或异常 - 用
git diff dev master对比两个分支的差异,确认dev的新代码都在master里 - 跑一遍项目的测试用例,确保功能正常
给你提几个后续预防的小建议
- 尽量别在master上用
git reset --hard这种改写历史的操作,用git revert更安全,不会破坏分支历史的连贯性 - 平时定期把master合并到dev(而不是等到最后才合并dev到master),这样能分散冲突,减少大规模合并出问题的概率
- 合并前一定要拉取最新的远程分支,确保本地分支是最新状态
内容的提问来源于stack exchange,提问作者CalebBX
相关产品推荐
相关产品推荐

