merge--no-ff和--ff和--squash的区别

一张图来告诉你–no-ff和–ff

git merge

我们平常什么都不加的时候,则使用默认的 –ff , 即 fast-forward 方式

fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建commit

git merge –no-ff

1
指的是强行关闭fast-forward方式,保留分支的commit历史

git merge –squash

是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用

动图来告诉几种合并的区别





举个例子

在master分支上,执行git merge hotfix
然后看到了Fast-forward 的字样,hotfix通过–ff的方式合进了master,如下:

仅仅是master指针指向了这个提交C4。这样是一种比较快的合并方式,轻量级,简单。
这个时候,我们往往会删掉hotfix分支,因为它的历史作用已经结束,这个时候,我们的iss53这个功能又向前开发,进行了一次提交,到了C5,那么变成了这样:

然后,我们要把iss53 这个分支合并回master,因为有分叉,两个版本的内容要进行合并,是不能用Fast-forward(只有在没有需要合并内容的时候,会有这个fast-forward 方式的提交) ,这时用的就是–no-ff的效果,并生成了一个新的commit号

如果我们对第一次合并,使用了–no-ff参数,那么也会产生这样的结果,生成一个新的提交,实际上等于是对C4 进行一次复制,创建一个新的commit,这就是–no-ff的作用。

参考:
“git merge”和”git merge–no ff”有什么区别?
Git:git-merge的–ff和–no-ff