You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并冲突未显示: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上:

  1. 切换到master分支:
git checkout master
  1. 执行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的内容:

  1. 切换到master分支:
git checkout master
  1. 执行合并,指定冲突时采用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:52:59