如何在任意提交点将一个功能分支拆分为两个独立功能分支?
拆分Git分支:将指定提交迁移到新分支
方法一:cherry-pick + reset 组合操作
- 切换到
foo分支,确认提交序列:
git checkout foo git log --oneline此时能看到提交链
C -> E -> F -> G -> H,可以记下G、H的提交哈希,或者用相对引用(foo~1对应G,foo对应H)。- 切换到
- 基于提交C创建新分支
bar:
git checkout -b bar C如果C是master分支的最新提交,也可以直接用
master替代C。- 基于提交C创建新分支
- 将G、H提交复制到
bar分支:
git cherry-pick <G的提交哈希> <H的提交哈希> # 用相对引用简化命令: git cherry-pick foo~1 foo若出现冲突,解决冲突后执行
git cherry-pick --continue即可。- 将G、H提交复制到
- 把
foo分支回退到仅保留E、F提交的状态:
git checkout foo git reset --hard <F的提交哈希> # 用相对引用简化: git reset --hard foo~2注意
--hard会丢弃工作区未提交的修改,执行前确认没有未保存内容。- 把
方法二:rebase --onto 高效迁移
- 先创建
bar分支,暂时指向foo的最新提交H:
git checkout -b bar foo- 先创建
- 将
foo分支回退到F提交:
git checkout foo git reset --hard <F的提交哈希> # 相对引用简化:git reset --hard foo~2- 将
- 把
bar分支上的G、H提交迁移到C提交之上:
git checkout bar git rebase --onto C <F的提交哈希> # 相对引用简化:git rebase --onto master foo这里
--onto C指定新基准是C,<F的提交哈希>表示只迁移F之后的提交(即G、H)。遇冲突解决后执行git rebase --continue。- 把
完成操作后,分支结构将变为:
Master ---A---B---C |\ Foo | E---F | Bar G---H
内容的提问来源于stack exchange,提问作者Lacrosse343
相关产品推荐
相关产品推荐

