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

时间:2024-03-27 08:36:02

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

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

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

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

1.fast forward

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

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

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

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

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

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

2.no fast forward

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

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

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

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

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

3.squash(第一种)

第一种squash,develop分支切出之后,master分支没有新的提交

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

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

下面的图的情况和fast forward以及no fast forward处理之前是一样的

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

现在切回master分支,将develop分支合并到master。

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

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

从版本库的分支历史记录,是无法看出develop合并到master分支上的记录的。这是squash和其他合并方式的最主要的区别。

并且master和develop还保持着相互独立

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

二、Three Way Merge和Squash的对比

1.three way merge

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

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

master分支在C3的基础上开发了C6,C7这样进行合并的话,是无法fast forward的。

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

合并方式:1.找到master分支的最新节点C7

2.找到develop分支的最新节点C5

3.找到master分支和develop分支的共同祖先节点C3

4.对C3,C5,C7进行三方合并,最后生成新的commitC8

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

2.squash(第二种)

第二种squash,develop分支切出之后,master分支也有了新的提交

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

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

master分支在C3的基础上开发了C6,C7这样进行合并的话

下面的图的情况和three way merge处理之前是一样的

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

合并方式,直接把develop上的2个结点的变化提取出来,然后直接应用在master分支上。

从版本库的分支历史记录,是无法看出develop合并到master分支上的记录的。这是squash和其他合并方式的最主要的区别。

并且master和develop还保持着相互独立

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

参考资料

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://*.com/questions/2850369/why-does-git-fast-forward-merges-by-default