git中做跨分支的功能合并时常用到两个命令:merge
和rebase
merge
将A分支的修改合并到B分支;
- 基于A分支最新Commit与B分支最新Commi生成新Commit,head移动到新的commit
- 从两个分支的最近公共节点开始到新生成的Commit之间进行diff,如果有冲突,则手动解决随着最新commit提交
- merge后,A分支的commit和B分支的commit的hash不变
- merge后,如果用
git log
命令查看,两个分支的commit会以各自提交的时间顺序排序
rebase
改变A分支的基线到B分支的head位置,从而合入B分支的最新修改:
- 找到A分支与B分支的最近公共节点
- 将A分支的提交与B支公共节点后的所有提价逐个比较,直到移动到B的head
- 如果比较过程中遇到冲突,需要手动解决
- 基线修改后,A分支所有的Commit的Hash会变化
- rebase后,如果用
git log
命令查看,A分支的提交会接在B分支之后,不保证时间上的排序
举例
基于mater
开了一个login
分支并在上面进行登录功能开发。其他开发者更新了master
的内容后,需要将master
的内容合并入我的login
分支
如上图,需要将master的E、F 合并入login。
如果使用merge
,则会在login
生成M节点,并将head执行M,M有两个parent分别是F和D
如果使用rebase
,则从B开始,将C和D应用(逐个比较)到master
的最后
注意,移动后的C、D与原来的C、D的hash不同,C的parent从B变为F。
最后
当需要进行跨分支功能合并时,推荐首先rebase
。merge不行改变原来所有commit的parent关系,所以只好生成一个额外节点用来更新head的位置,这样会形成一个环形的提交记录。而rebase做了变基,所以可以保持直线的提交记录,这样的提交记录更容易维护。