关于Git的fast forward和no fast forward 以及squash(聚合)

没时间画图,貌似也不太会用画图工具,先写了一个文字版本的

 

fast forward

假设从master分支有三个节点C1,C2,C3

从C3切出develop分支,并在develop分支上开发了C4,C5

现在切回master分支,将develop分支合并到master。默认使用fast forward,master分支会直接指向C5。master分支的节点为C1,C2,C3,C4,C5

 

no fast forward

假设从master分支有三个节点C1,C2,C3

从C3切出develop分支,并在develop分支上开发了C4,C5

现在切回master分支,将develop分支合并到master。如果使用no  fast forward,在master分支上会生成一个新的commit为C6。master分支的节点为C1,C2,C3,C4,C5,C6

 

three way merge

假设从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(聚合)

假设从master分支有三个节点C1,C2,C3

从C3切出develop分支,并在develop分支上开发了C4,C5

现在切回master分支,将develop分支合并到master。如果使用聚合的方式进行合并的话,那么git会将develop分支上所有的commit压缩成一个新的commit为C6直接合并到master分支。

最后master分支上的节点为C1,C2,C3,C6

 

 

参考资料

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

 

使用tortoisegit在pull别人的代码的时候,界面有可选参数

关于Git的fast forward和no fast forward 以及squash(聚合)关于Git的fast forward和no fast forward 以及squash(聚合)

 

fast forward only的意思还不太清楚

 

git rebase可以参看《git详解之三 git分支》,也是用于分支合并。相比于三方合并,这个使用的方法类似于打补丁,将develop分支的修改部分重新应用到master分支

git reset可以谷歌一下,主要是回退版本的

你可能感兴趣的:(forward)