Merge和Rebase
区别。参考闲谈 git merge 与 git rebase 的区别
- merge 合并两个分支的Head;提交历史忠实地记录了实际发生过什么,关注点在真实的提交历史上面。
- rebase 提取当前分支的修改,将其复制在了目标分支的最新提交后面;反映了项目过程中发生了什么,关注点在开发过程上面
- 区别。
merge
会保留当前分支的历史记录,而rebase
会改动当前分支的历史记录。
Merge合并方式
FAST-FORWARD 和非 FAST-FORWARD
- FAST-FORWARD:当前分支HEAD是欲合并入分支的一个祖先节点,无需创建额外的合并提交(create a merge commit)节点,直接更新HEAD指针。
- 非FAST-FORWARD:合并后会创建额外的合并提交节点,这是TRUE MERGE,有几种合并策略。
使用
- 执行
git merge others
。如果系统认为当前分支HEAD是others
分支的一个祖先节点,会使用FAST-FORWARD
方式,否则使用非FAST-FORWARD
方式。 - 执行
git merge others --ff
。同执行git merge others
。 - 执行
git merge others --no-ff
。都会创建一个额外合并提交节点。 - 执行
git merge others --ff-only
。如果系统认为当前分支HEAD是others
分支的一个祖先节点,会使用FAST-FORWARD
方式,否则不执行合并。
Merge合并策略
非FAST-FORWARD的的几种合并策略:
- resolve。采用三路合并,当有多个共同祖先时,系统采用自认为合适的祖先。
- recursive。采用递归三路合并。
- octopus。合并超过两个分支时。
三路合并(3-way merge)算法 参考维基百科-合并 (版本控制)
- 简单三路合并。两个分支的文件和共同祖先文件做差异分析。
- 递归三路合并。有多个共同祖先,先创建虚拟共同祖先。