Git回滚误合并分支后pull master导致xyz分支特性文件丢失问题
问题根因
问题本质是git revert处理合并提交时,会生成一个和原合并提交内容完全相反的反向提交,把合并进来的所有变更标记为「已撤销」状态。当你反向把回滚后的master合并进xyz分支时,Git会判定xyz上原有的新特性变更已经在提交历史中被处理过(被那个revert提交撤销了),不会重新应用这些变更,最终导致xyz分支内容和回滚后的master完全一致,原有新特性全部丢失。
解决步骤
场景1:合坏的本地xyz分支还没推送到远程
这是处理成本最低的情况,直接回退本地分支状态即可:
- 执行
git reflog浏览本地所有操作记录,定位到你执行pull合并master之前,xyz分支最后一个包含完整新特性的提交哈希值 - 切换到xyz分支,执行
git reset --hard <刚才定位到的正确提交哈希> - 执行完上述操作本地xyz就会恢复到所有新特性、专属文件都存在的正常状态。后续如果需要同步master的正常更新,不要直接pull合并,先在master分支上把之前回滚xyz合并的那个revert提交再做一次revert(即撤销那次回滚操作),再执行分支合并就不会出现内容丢失。
场景2:已经把合坏的xyz分支推送到远程仓库
如果是多人协作的分支已经推送到远程,不要直接硬重置后强推,避免影响其他协作者,按以下步骤修复:
- 切换到master分支,找到之前回滚xyz合并的那个revert提交的哈希值,执行
git revert <revert提交哈希> -m 1,这个操作会生成新的提交,把之前回滚掉的xyz分支变更重新恢复,相当于告知Git之前的回滚操作作废,认可原合并的内容有效性 - 切回xyz分支,执行
git merge master把刚才生成的新提交合并进xyz,之前丢失的所有新特性、专属文件就会全部恢复 - 后续正常开发、分支合并都不会再出现内容丢失问题。
避坑说明
- 主分支误合并开发分支后做了revert回滚的,不要直接把主分支反向合并回开发分支,必然会出现开发分支原有内容被冲掉的问题
- 如果必须同步主分支的变更到开发分支,一定要先在主分支上revert之前的回滚提交,再执行合并操作。
内容的提问来源于stack exchange,提问作者Jameel Ahmed Ansari
相关产品推荐
相关产品推荐

