github上上传了版本库https://github.com/ChuckGitMerge 包括merge和rebasehtml
没时间画图,貌似也不太会用画图工具,先写了一个文字版本的git
更新:2015年08月11日,使用了git for windows自带的git gui做为图片说明github
假设从master分支有三个节点C1,C2,C3windows
从C3切出develop分支,并在develop分支上开发了C4,C5工具
如今切回master分支,将develop分支合并到master。默认使用fast forward,master分支会直接指向C5。master分支的节点为C1,C2,C3,C4,C5ui
develop分支和master分支,看起来是彻底同样的spa
假设从master分支有三个节点C1,C2,C3htm
从C3切出develop分支,并在develop分支上开发了C4,C5blog
如今切回master分支,将develop分支合并到master。若是使用no fast forward,在master分支上会生成一个新的commit为C6。master分支的节点为C1,C2,C3,C4,C5,C6three
第一种squash,develop分支切出以后,master分支没有新的提交
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
下面的图的状况和fast forward以及no fast forward处理以前是同样的
如今切回master分支,将develop分支合并到master。
若是使用聚合的方式进行合并的话,那么git会将develop分支上全部的commit压缩成一个新的commit为C6直接合并到master分支。
最后master分支上的节点为C1,C2,C3,C6
从版本库的分支历史记录,是没法看出develop合并到master分支上的记录的。这是squash和其余合并方式的最主要的区别。
而且master和develop还保持着相互独立
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
master分支在C3的基础上开发了C6,C7这样进行合并的话,是没法fast forward的。
合并方式:1.找到master分支的最新节点C7
2.找到develop分支的最新节点C5
3.找到master分支和develop分支的共同祖先节点C3
4.对C3,C5,C7进行三方合并,最后生成新的commitC8
第二种squash,develop分支切出以后,master分支也有了新的提交
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
master分支在C3的基础上开发了C6,C7这样进行合并的话
下面的图的状况和three way merge处理以前是同样的
合并方式,直接把develop上的2个结点的变化提取出来,而后直接应用在master分支上。
从版本库的分支历史记录,是没法看出develop合并到master分支上的记录的。这是squash和其余合并方式的最主要的区别。
而且master和develop还保持着相互独立
参考资料
http://www.open-open.com/lib/view/open1328069889514.html git详解之三 git分支
http://ariya.ofilabs.com/2013/09/fast-forward-git-merge.html Fast-Forward Git Merge
http://stackoverflow.com/questions/2850369/why-does-git-fast-forward-merges-by-default