场景:
基于main
分支创建了一个特性分支feature
,在feature
上新增了C2
、C3
、C4
提交
同时main
分支上又合入了其他提交
这时如果要将main
分支上新引入的这些变更也整合进feature
分支,此时使用merge
还是rebase
相同点:merge
还是rebase
都具备整合分支的能力
不同点:实现方式
merge
在feature
上执行git merge main
时,git会以我方(feature
)、对方(main
)以及双方最近公共祖先对应的快照执行三路合并生成新快照,并基于此快照创建一个连接feature
分支和main
的合并节点,最后调整feature
的指向
结论:merge
总是在向前推进提交历史,并不会影响提交的原始状态
rebase
整合方式是对提交历史的重写,在feature
上执行git rebase main
时,git会从双方最近的公共祖先开始,将feature
上每个提交对应的变更暂存起来,然后以main
分支所指向的提交为新起点,将暂存的变更按顺序一一还原成新提交。rebase
完成后,feature
分支的起始点变成了main
分支最后的快照
通常情况下:merge
还是rebase
,特性分支feature
最终所指向的快照完全相同。也就是说merge
合成的快照和rebase
重建出的快照所对应的代码内容是完全相同的,但却构建出了不同的提交历史