Git的fast forward和no fast forward和 three way merge 以及squash(聚合)

github上上传了版本库https://github.com/ChuckGitMerge   包括merge和rebase

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

更新:2015年08月11日,使用了git for windows自带的git gui作为图片说明

 

动画效果

https://devblogs.microsoft.com/devops/pull-requests-with-rebase/

 

一、Fast Forward,No Fast Forward 和 Squash的对比

1.fast forward

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

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

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

  

develop分支和master分支,看起来是完全一样的

 

2.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

 

3.squash(第一种)    

 第一种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还保持着相互独立

 

 

 

二、Three Way Merge和Squash的对比

1.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

 

 

 

2.squash(第二种)

第二种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

posted @ 2014-12-04 19:44  ChuckLu  阅读(5418)  评论(5编辑  收藏  举报