Git中对已squash合并后新增提交分支的类rebase操作实现方案
解决方法
方案1:git rebase --onto 一步实现你要的分支效果
这个命令完全匹配你期望的rebase效果,不需要手动逐个cherry-pick提交:
# 切换到本地feature分支 git checkout feature # 执行rebase操作:将F3之后的所有提交,移植到main分支的最新提交(即M3)上 git rebase --onto main F3
注意把上面的
F3替换为你被squash合并的最后一个feature提交的SHA值。
执行完成后,feature分支的提交历史就会变成你要的结构:完全基于M3,仅保留F4、F5两个新提交。之后合并到main分支就不会再有历史不兼容的问题:
git checkout main git merge --squash feature
方案2:简化版cherry-pick操作
如果你不想修改原feature分支的历史,也可以直接批量cherry-pick区间提交到main:
git checkout main # 直接将F3之后的所有提交批量cherry-pick到当前main分支 # 加-n参数可以把所有提交的改动合并成一个新提交,和--squash效果一致 git cherry-pick -n F3..feature git commit
相关原理
git merge --squash不会生成标准合并提交,也不会记录两个分支的关联关系,所以Git默认无法识别F1-F3已经被整合到M3中,普通合并或rebase时会重复处理F1-F3的改动导致冲突。rebase --onto命令显式指定了新的基准提交和要丢弃的旧提交范围,就能跳过已经被squash的部分,仅移植后续新提交。
内容的提问来源于stack exchange,提问作者Eric Canton
相关产品推荐
相关产品推荐

