项目开发过程中会遇到如下场景:当前主分支A切出一个分支B,B功能开发了一半,但已经有比较多的commit产生。这时候主分支A由于某些原因发生了变化,如通过回退操作到了之前的某个位置。B当然希望这时候也同步主干A的改动,可以发现如果直接merge 主干分支是不能把A回退的那部分提交也合并掉。
解决方案
方案一,通过打patch的方式。基于新的A分支建立新分支C,把B新产生的内容生成一个大patch,然后apply到新的分支C, 这样会丢失中间的git信息,并不是一个很好的方法
方案二,通过cherry-pick,基于新的A分支建立新分支C,把B新产生的内容一次性操作过来
git cherry-pick commitId..commitId
方案三,通过强大的rebase变基操作。
// base分支名称
// from待合并片段的起始commitId(不包含)
// to待合并片段的结束commitId(包含)
git rebase --onto base from to
操作步骤
- 新的主干A建立新分支C,
- 把B的改动rebase到C分支 git rebase --onto A B开始commitId B结束commitId
- 这样会B的新改动放到C最新的commit,然后新建一个分D
- D就是基于主干上合了B最新代码的最终分支
常用的变基操作
我们来合并最近的 4 次提交纪录
git rebase -i HEAD~4
通过rebase来消除本地产生的merge信息
git rebase master
通过rebase来消除合并远程代码产生的merge信息
git pull --rebase
真正使用的时候看情况而定,毕竟rebase会改变提交历史