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的信息
你可以把下图最左侧
*
理解为mater分支上的提交点(区别于提交记录),发现master上面有3个提交点
fast forward形成如下git tree06fc66d---fd1640c branchA / master 76b7dbe
现在,我们使用
git reset --hard HEAD^
命令把master分支回退一个版本试一下,回退版本后发现回到了branchA 06fc66d这次提交(因为是branchA的中间提交,可能只完成了一个需求中的部分功能,不能保证这次提交的是稳定的代码,这样就给mater版本稳定性带来风险)
-
no fast forward(- -no-ff)
输入如下命令:git merge --no-ff -m 'merge branchA with no-fast' branchA
发现master上面只有2个提交点(最左侧
*
),并且在第二个提交点上可以看到merge的信息(merge branchA with no-fast
)
no fast forward形成如下git tree06fc66d---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
如果顺着一个分支走下去可以到达另一个分支的话
我们看看git tree
相信你应该知道如何让branchB走Fast-Forward模式了吧?