git merge --no-ff参数详解

git 在合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么在合并两者时,git 只会简单地把指针右移,这种操作就是“快进”(fast-forward)

一、我们先来看看fast forword和no fast forward(- -no-ff)在git tree上面的区别

  • 先在master分支做一次初始提交76b7dbe wrote a readme file

  • 在master这次提交的基础上创建branchA,并做两次提交06fc66d add branchA-1.txt, fd1640c add branchA-2.txt

  • 在master这次提交的基础上创建branchB,并做两次提交1843b9d add branchB-1.txt, 815a345 add branchB-2.txt

    切回master分支

  • fast forword
    输入如下命令:

    git merge -m 'merge branchA with fast' branchA
    

    可以看到,Fast-forward会忽略-m参数,在git tree上也无法看到merge的信息
    Fast-forward会忽略-m参数

    你可以把下图最左侧*理解为mater分支上的提交点(区别于提交记录),发现master上面有3个提交点
    merge branchA with fast
    fast forward形成如下git tree

    		          06fc66d---fd1640c branchA
    		         /         			master
    		76b7dbe
    

    现在,我们使用git reset --hard HEAD^命令把master分支回退一个版本试一下,回退版本后发现回到了branchA 06fc66d这次提交(因为是branchA的中间提交,可能只完成了一个需求中的部分功能,不能保证这次提交的是稳定的代码,这样就给mater版本稳定性带来风险)
    回退版本后回到了06fc66d这次提交

  • no fast forward(- -no-ff)
    输入如下命令:

    git merge --no-ff -m 'merge branchA with no-fast' branchA
    

    发现master上面只有2个提交点(最左侧*),并且在第二个提交点上可以看到merge的信息(merge branchA with no-fast
    merge branchA with no-fast
    no fast forward形成如下git tree

      				06fc66d---fd1640c           branchA
    		      /                   \
    	  76b7dbe --------------------- 295a439 master
    

    现在,我们再使用git reset --hard HEAD^命令把master分支回退一个版本试一下,回退版本后发现直接回到了merge前master 76b7dbe的这次提交(这样就保证了master分支的相对稳定)

二、总结一下

  • 使用fast forword,master分支上会显示两次提交记录06fc66d,fd1640c。使用no fast forword, master分支上只会显示295a439一次提交记录。no fast forword时master分支提交点更少(如需master上提交记录减少,也就是git commit记录减少,可使用–squash参数)。
  • 使用git reset --hard HEAD^回退上一个版本时,fast forword可以回退到branchA分支的某次提交点,而no fast forword只能回退到master分支merge之前的提交点。

三、是不是很简单,觉得自己已经掌握了no fast forward了?

看一下下面这个例子:
我先使用–no-ff no fast forward方式merge branchA,然后使用–no-ff也就是fast forward方式merge branchB可以吗?我们来试一下
输入如下命令:

git merge --no-ff -m 'merge branchA with no-fast' branchA
git merge -m 'merge branchB with fast?' branchB

你会发现第二次并没有走Fast-Forward
你会发现第二次并没有走Fast-Forward,这是为什么?开头解释了什么情况下会走Fast-Forward

如果顺着一个分支走下去可以到达另一个分支的话

我们看看git tree
git tree
相信你应该知道如何让branchB走Fast-Forward模式了吧?
让branchB走Fast-Forward模式


版权声明:本文为REX1129原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。