git合并代码方式主要有两种方式,分别为:
1、merge处理,这是大家比较能理解的方式。
2、rebase处理,中文此处翻译为衍合过程。
先来两张合理使用rebase,merge和只使用merge的对比图
使用 rebase
使用 merge
使用 rebase 和 merge 的基本原则:
下游分支更新上游分支内容的时候使用 rebase
上游分支合并下游分支内容的时候使用 merge
更新当前分支的内容时一定要使用–rebase 参数
git rebase操作讲解例子:
至此,我们简单分析下情况为:
master分支,节点链表指向为:c1<–c3<–c4
dev分支,节点链表指向为:c1<–c2<–c5
master分支和dev分支祖先为c1,假定在master分支上做git merge dev合并,得到的提交历史为:
c1<–c2<–c3<–c4<–c5<–c6(c1、c4、c5做了一次三方合并发现冲突,手工处理完毕后git add/commit增加了提交节点c6)
采用git merge dev处理提交log是按照时间戳先后顺序的。
假定采用的是git rebase处理过程为:
此处处理后的节点为:
c1 c3 c4 c2 c5 # 此处不是按照时间顺序处理的
综合表现,git rebase可以得到一个更加简洁的提交历史,无需多了c6。
处理完毕后,git checkout master加上git merge dev,git会智能采用f-f处理。
总结为:
git rebase过程相比较git merge合并整合得到的结果没有任何区别,但是通过git rebase衍合能产生一个更为整洁的提交历史。
如果观察一个衍合过的分支的历史提交记录,看起来会更清楚:仿佛所有修改都是在一根线上先后完成的,尽管实际上它们原来是同时并行发生的。
一般我们使用衍合的目的,是想要得到一个能在远程分支上干净应用的补丁,比如某个项目你不是维护者,但是想帮点忙,最好使用衍合处理。(不会多出来一条分支)
先在自己的一个分支进行开发,当准备向主项目提交补丁的时候,根据最新的orgin/master进行一次衍合操作然后再提交,这样维护者就不需要任何整合工作。
实际为:把解决分支补丁同最新主干代码之间的冲突的责任,划转给由提交补丁的人来解决。
作为维护项目的人只需要根据你提供的仓库地址做一次快进合并,或者直接采纳你提交的补丁。
衍合的风险,请务必遵循如下准则:
一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。
参考文档
https://www.jianshu.com/p/025aaa1a2c34