如何将feature1分支提交迁移至dev分支并避免大量合并冲突
迁移feature1提交到dev分支的可行方案
以下两种方案均可以跳过experimental分支的无关提交,仅迁移feature1的独有改动:
方案1:使用rebase --onto一次性迁移全量提交(适合提交序列无交叉依赖的场景)
该方案可以把feature1的所有提交整体重放到dev分支顶端,后续合并为快进合并,不会产生额外冲突:
- 先拉取远程最新代码,保证本地分支和远程同步:
git fetch origin - 切换到本地feature1分支:
git checkout feature1 - 找到feature1从experimental分支切出的分叉点提交哈希,记为
<分叉点commit哈希>,执行变基操作:
执行过程中遇到冲突时,逐个文件解决冲突后执行git rebase --onto dev <分叉点commit哈希> feature1git add 冲突文件名,再运行git rebase --continue继续后续提交的重放,若要终止操作可执行git rebase --abort恢复变基前的状态。 - 变基完成后切换到dev分支,直接合并处理好的feature1即可:
git checkout dev git merge feature1 - 若feature1之前已经推送过远程仓库,变基会改写提交历史,需要执行
git push --force-with-lease origin feature1更新远程分支,避免覆盖其他人的提交。
方案2:使用cherry-pick批量迁移提交(适合需要灵活筛选提交的场景)
该方案支持跳过feature1中不需要的提交,灵活度更高:
- 拉取远程最新代码后切换到dev分支:
git fetch origin git checkout dev - 执行命令查看feature1独有的所有提交,确认要迁移的提交范围,记最早的提交哈希为
<起始commit哈希>,最晚的提交哈希为<结束commit哈希>:git log --oneline experimental..feature1 - 执行批量cherry-pick迁移提交:
后缀git cherry-pick <起始commit哈希>^..<结束commit哈希>^表示包含起始提交本身,过程中遇到冲突解决后执行git add 冲突文件名,再运行git cherry-pick --continue继续,不需要的提交可执行git cherry-pick --skip跳过,终止操作执行git cherry-pick --abort。
优化建议
如果feature1的400个提交粒度太细导致冲突处理次数过多,可以先将feature1的提交squash为几个大的功能提交后再迁移,大幅降低冲突处理成本。
内容的提问来源于stack exchange,提问作者Zbigniew Kisły
相关产品推荐
相关产品推荐

