如何将一个feature分支合并到多个Git主分支?
我需要把同一个功能修改推送到两个主分支current_version和previous_version,但直接用单个feature分支会遇到无关提交、冲突等问题,以下是针对疑问的具体解答:
是否可以仅用一个feature_branch完成该操作?
不行。两个主分支的代码基线不同,单个分支无法同时适配两个基线的PR需求——要么PR携带无关提交,要么触发冲突,没法同时满足两个合并目标的干净PR要求。若无法同时完成,能否在第一个PR合并后复用feature_branch?比如使用rebase,应按什么顺序操作?
可以,操作顺序需明确:
- 假设先将
feature_branch合并到previous_version:- 合并PR后,拉取最新的
previous_version和current_version分支 - 切换到
feature_branch,执行命令:git rebase --onto current_version previous_version feature_branch,将feature分支中在previous_version之上的提交迁移到current_version顶端 - 解决可能的冲突后推送(若之前推过远程分支,需加
--force-with-lease) - 基于rebase后的分支创建合并到
current_version的PR
- 合并PR后,拉取最新的
- 若先合并到
current_version,只需将命令中的两个主分支互换即可。
若需要两个feature分支,能否从第一个分支创建第二个分支(仅做一次修改)并使用rebase?
完全可以,流程如下:基于其中一个主分支(比如
previous_version)创建feature_branch_old,完成功能修改并提交从
feature_branch_old创建新分支:git checkout -b feature_branch_new feature_branch_old对
feature_branch_new执行:git rebase --onto current_version previous_version feature_branch_new,将修改迁移到current_version基线分别用两个分支创建对应主分支的PR
第二种方法能否用于同时创建PR?(我认为先后操作与问题2无差异)
可以同时创建。两个feature分支相互独立,分别基于不同的主分支基线,只要各自的修改和rebase完成,就能同时提交PR,无需等待其中一个合并。是否可以使用cherry-pick?但我希望一次性获取feature_branch的所有修改。
可以用批量cherry-pick实现。先找到feature_branch基于的基线提交(比如previous_version的某个commit哈希),切换到目标主分支的临时分支后,执行:
git cherry-pick <基线commit哈希>..feature_branch
这样就能一次性把feature_branch上的所有提交cherry-pick到当前分支。注意:cherry-pick会生成新的提交哈希,与原分支提交完全独立。
- 能否创建该rebase后的分支副本,保留原分支?
可以。不要直接在原分支上执行rebase,先创建原分支的副本,再对副本操作:
# 假设原分支是feature_branch,基于previous_version git checkout -b feature_branch_current feature_branch git rebase --onto current_version previous_version feature_branch_current
原feature_branch会完全保留,feature_branch_current则是迁移到current_version后的分支。
能否在feature_branch之上创建feature_branch_current并对其执行rebase?
可以,操作逻辑和问题6一致。创建分支时基于feature_branch,之后对新分支执行rebase --onto,原分支不会受到任何影响。能否创建feature_branch的精确副本feature_branch_current,再对其执行rebase并保留原分支?
当然可以。用git checkout -b feature_branch_current feature_branch就能创建精确副本,之后对副本的任何操作(包括rebase)都不会改变原feature_branch——因为Git分支只是指向提交的指针,副本是独立的新指针,与原分支无关联。
通用推荐流程
针对这类需要同步修改到多个主分支的场景,最干净的方式是创建两个独立的feature分支,分别基于目标主分支,复用提交内容:
- 选择其中一个主分支(比如
previous_version)创建feature/fix-config-old,完成修改并提交 - 创建另一个分支
feature/fix-config-new,基于current_version - 用批量cherry-pick或者
rebase --onto把feature/fix-config-old的修改迁移到feature/fix-config-new - 分别提交两个PR到对应主分支,各自处理可能的冲突(如果有的话)
这种方式能保证两个PR都干净无无关提交,且分支之间互不影响。
内容的提问来源于stack exchange,提问作者user2739975

