Git合并子分支到父分支时被已还原提交覆盖代码的解决方案求助
解决方案
方案1(最高优先级推荐,不修改子分支历史,无协作冲突风险)
核心逻辑:父分支上的Dr/Er/Fr是针对你之前误提交的D/E/F的撤销操作,只需要先把这三个撤销操作本身撤销,父分支就能回到和子分支基线完全对齐的状态,后续合并不会触发回滚逻辑。
操作步骤:
- 切换到本地父分支,拉取远端最新代码保证版本一致
git checkout Father git pull origin Father
- 找到
Dr/Er/Fr三个revert提交的commit哈希,按从旧到新的顺序依次撤销这三个提交:
# 单条撤销示例,替换为实际的commit哈希 git revert <Dr的commit哈希> git revert <Er的commit哈希> git revert <Fr的commit哈希> # 如果三个提交是连续的,可批量操作,替换为实际的起止哈希即可 git revert <Dr的commit哈希>^..<Fr的commit哈希>
- 此时父分支状态已经和子分支的
D/E/F基线完全对齐,直接合并子分支即可:
git merge <子分支名称>
- 全量验证代码功能无误后,推送到远端即可。
方案2(适合要求线性提交历史的场景,提交记录更简洁)
核心逻辑:已知父分支除了三个revert提交外无其他变更,通过rebase操作将子分支的所有提交移植到父分支最新节点上,全程优先保留子分支的变更即可规避revert回滚问题。
操作步骤:
- 切换到本地子分支,拉取远端最新代码
git checkout <子分支名称> git pull origin <子分支名称>
- 执行rebase操作,指定父分支为上游,所有冲突统一选择保留子分支的变更:
git rebase Father # 若出现冲突,对每个冲突文件执行以下操作保留子分支代码 git checkout --ours <冲突文件路径> git add <冲突文件路径> # 所有冲突处理完成后继续rebase流程 git rebase --continue
- rebase完成后切换回父分支,执行快进合并:
git checkout Father git merge <子分支名称>
- 验证代码功能无误后推送远端即可。
方案选择建议:如果子分支是多人协作的公共分支,优先选择方案1,不会修改子分支的提交历史,不会影响其他协同开发的同事;如果是个人开发的分支且团队要求线性提交历史,可选择方案2。
内容的提问来源于stack exchange,提问作者RushTfe
相关产品推荐
相关产品推荐

