原文地址

目录

  • Fast forward 概述
  • 强制禁用 Fast forward 模式的具体方法
  • Fast Forward 和 no fast foward 合并模式对比
  • 分支策略
  • 小结

Fast forward 概述

通常,合并分支时,如果可能,Git会用Fast forward模式。

举例来说,开发一直在 master 分支进行,但忽然接到了一个新的需求,于是新建了一个 dev 的分支,并在其上进行一系列提交,完成时,回到 master 分支,此时,master 分支在创建 dev 分支之后并未产生任何新的 commit。此时的合并就叫 Fast forward

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

如果要强制禁用Fast forward模式,Git 就会在 merge 时生成一个新的 commit,这样,从分支历史上就可以看出分支信息。--no-ff指的是强行关闭fast-forward方式

强制禁用 Fast forward 模式的具体方法

首先,仍然创建并切换dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

修改readme.txt文件,并提交一个新的commit:

$ git add readme.txt
$ git commit -m "add merge"
[dev 6224937] add merge1 file changed, 1 insertion(+)

现在,我们切换回master

$ git checkout master
Switched to branch 'master'

准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward

$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.readme.txt |    1 +1 file changed, 1 insertion(+)

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

合并后,我们用git log看看分支历史:

$ git log --graph --pretty=oneline --abbrev-commit
*   7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
*   59bc1cb conflict fixed
...

可以看到,不使用Fast forward模式,merge后就像这样:

关于默认的fast-forward的,上面引文没有详述。基本就是看不出有从其他分支合并过来的信息,只能看到每个commit实际的信息。如果其他分支丢失了,分支合并的信息就丢失了。

自己试了一下 默认的有fast-forward的情况。如下:

$ git checkout -b testff
Switched to a new branch 'testff'$ vi readme$ git add readme$ git commit readme
test ff
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Explicit paths specified without -i or -o; assuming --only paths...
# On branch testff
# Changes to be committed:
#   new file:   readme
#...
".git/COMMIT_EDITMSG" [converted] 8L, 282C written
[testff 5a036ee] test ff1 file changed, 1 insertion(+)create mode 100644 readme$ git checkout -b newtestff
Switched to a new branch 'newtestff'$ git merge testff
Already up-to-date.$ git diff testff newtestff$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.$ git pull$ git checkout -b newff
Switched to a new branch 'newff'$ git checkout newff
Already on 'newff'$ git merge testff
Updating 30a974d..5a036ee
Fast-forwardreadme | 1 +1 file changed, 1 insertion(+)create mode 100644 readme$ git log --graph --pretty=oneline --abbrev-commit
* 5a036ee test ff
*   30a974d Merge branch 'xxx' into master
|\
...

重点看两点:

  1. 第一处在test-ff版本 checkout -b的,结果发现git 两个branch完全没有差别。

    git checkout -b dev 命令相当于
    创建分支: git branch dev 切换分支: git checkout dev

    而这个创建是基于当前HEAD的。

    所以新创建的分支和test-ff没有区别。

  2. 采用默认的merge之后,使用git log --graph --pretty=oneline --abbrev-commit 能够看到:

    * 5a036ee test ff

    完全没有原来 test-ff 分支的信息。

    另,git log 命令加上后面的参数很好用,--graph --pretty=oneline --abbrev-commit

    比原始的输出好看多了。

Fast Forward 和 no fast foward 合并模式对比

分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

小结

Git 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

参考文章

Git 的 Fast Forward 和 no fast foward相关推荐

  1. Git的Fast Forward和no fast foward合并模式对比

    详细版本见个人博客:Git的Fast Forward和no fast foward合并模式对比 通常,合并分支时,如果没有分歧解决,就会直接移动文件指针,这就是Fast forward模式. 举例来说 ...

  2. Git – Fast Forward 和 no fast foward

    Git 很是强大,在体验过rebase的华丽之后,再次发现之前在TFS上遇到的问题一下都有解了.但也印证了Git深入并非易事.这篇就谈下一个容易迷糊的概念:Fast forward. Fast-For ...

  3. Git- Fast Forward和no fast forward

    Git 很是强大,在体验过rebase的华丽之后,再次发现之前在TFS上遇到的问题一下都有解了.但也印证了Git深入并非易事.这篇就谈下一个容易迷糊的概念:Fast forward. Fast-For ...

  4. git merge 的两种模式的区别 --no-ff与fast forward

    git merge 将名字为branchName的分支合并到当前分支 有两种模式 git merge <branchName>:fast forward模式,快速合并,看不出做过合并. 不 ...

  5. FFmpeg是什么?(Fast Forward Moving Picture Experts Group)(AVFormat、AVCodec、AVFilter、AVDevice、AVUtil)

    文章目录 前言 一.FFmpeg的定义 二.FFmpeg的基本组成模块 (1)FFmpeg的封装模块AVFormat (2)FFmpeg的编解码板块AVCodec (3)FFmpeg的滤镜模块AVFi ...

  6. fast无线网卡linux驱动,fast无线网卡驱动,详细教您fast无线网卡驱动

    当我们使用笔记本电脑工作的时候,如果发现没有无线网络,有些用户会选择使用无线网卡,有的用户会使用fast无线网卡来上网,但是有用户不知道怎么都无法上网,这个时候该怎么办呢?这多半是因为没有安装fast ...

  7. 路由器fast服务器没响应,FAST路由器复位常见问题解决方法

    许多用户在给FAST路由器复位后,发现怎么也登陆不了FAST路由器的管理页面,下面学习啦小编就给大家详解一下其中的原因,希望对您有所帮助! FAST路由器复位常见问题解决方法 一.检查电脑的本地连接是 ...

  8. fast无线路由器设置服务器,Fast迅捷无线路由器端口映射设置方法 | 192路由网

    本文将介绍在Fast(迅捷)无线路由器上设置端口映射的方法,端口映射在Fast无线路由器中叫做虚拟服务器,它定义了广域网服务端口和局域网网络服务器之间的映射关系,所有对该广域网服务端口的访问将会被重定 ...

  9. 【fast ICA】基于fast ICA算法的去除伪迹matlab仿真

    1.软件版本 matlab2021a 2.本算法理论知识 FAST方法,步骤如下所示: 3.核心代码 clc; clear; close all; warning off; addpath 'func ...

最新文章

  1. 行列式求值、矩阵求逆
  2. 终端html页面,HTML5的终端适配
  3. mysql instead of_mysqluniqueoptionprefixmyisam_recoverinsteadofmyisam-recover-options的解决方法
  4. git 配置.gitignore 删除已提交的文件
  5. 【Java】Java多线程神器:join使用及原理
  6. 深度学习——夏侯南溪的深度神经网络的调参日志
  7. GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数?
  8. Android集成百度语音识别API
  9. 平年用c语言的计算方式,C语言平年闰年问题
  10. BZOJ 4552 [Tjoi2016Heoi2016]排序 ——线段树 二分答案
  11. ensp 交换机与路由器ospf_华为路由器 eNSP 配置 rip OSPF 路由重发布
  12. EST 云硬盘修复小工具-SAS希捷固件升级工具
  13. 插头DP/轮廓线DP
  14. 花生壳域名申请、内网映射到树莓派及与微信公众号对接
  15. 操作系统与计算机网络
  16. 鸿蒙系统荣耀新机,鸿蒙系统要来了?网传荣耀新机搭载麒麟9000+鸿蒙OS
  17. 大学生笔记本购买指南——扫盲版(2019)
  18. 每日思考第 76 期:真正的死亡是被人遗忘
  19. 全文搜索引擎ElasticSearch
  20. 对我国师生数学学习和教学观念的反思 郇中丹教授

热门文章

  1. 小白聊智慧制造之三:什么是智慧制造
  2. windows磁盘相关API实践说明
  3. MIDI in HTML5
  4. Pandas:数据结构DataFrame
  5. 合肥对口计算机,2021年合肥市对口考试要做哪些题目?计算机应用基础(Windows7+office2010)周测月考单元卷...
  6. Codeforces - Fedor and coupons
  7. CF467D Fedor and Essay
  8. Centos7安装MySQL5.7图文解析 (附MySQL安装包官网地址及MySQL5.7安装手册)
  9. pageOffice基本使用
  10. 明年辞职不用交违约金了!!