在许多介绍 Git 工作流的文章里,都会推荐在合并分支时,加上 --no-ff 参数:

$ git checkout develop$ git merge --no-ff feature

--no-ff 在这的作用是禁止快进式合并。我们平常什么都不加的时候,则使用默认的 --ff , 即 fast-forward 方式

Git 合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,叫做“快进”(fast-forward),比如下图:

A---B---C feature/D---E---F master
要把 feature 合并到 master 中,执行以下命令
$ git checkout master$ git merge feature

结果就会变成

A---B---C feature/ masterD---E---F

因为 feature 就在 master 的下游,所以直接移动了 master 的指针,master 和 feature 都指向了 C。而如果执行了 git merge --no-ff feature 的话,是下面的结果:

A---B---C feature/ \D---E---F-----------G master

由于 --no-ff 禁止了快进,所以会生成一个新的提交,master 指向 G。

从合并后的代码来看,结果其实是一样的,区别就在于 --no-ff 会让 Git 生成一个新的提交对象。为什么要这样?通常我们把 master 作为主分支,上面存放的都是比较稳定的代码,提交频率也很低,而 feature 是用来开发特性的,上面会存在许多零碎的提交,快进式合并会把 feature 的提交历史混入到 master 中,搅乱 master 的提交历史。所以如果你根本不在意提交历史,也不爱管 master 干不干净,那么 --no-ff 其实没什么用。
不过如果不加--no-ff的话,如果某一次 master 出现了问题,你需要回退到上个版本的时候,比如上例,你就会发现退一个版本到了 B,而不是想要的 F,因为 feature 的历史合并进了 master 里。

【一句话】

影响回退:

把dev分支使用普通默认merge的方式到master中后,提交历史信息合并到一起,导致回退时,可能回退到的不是自己想要的那个版本(回退到了分支中的某个版本);
加上--no-ff则不会,各个分支的提交历史信息不会合并到一起(会回退到master的上个版本)。

另,附上一个图便于理解:

图片来自:https://www.cnblogs.com/damoblog/p/13144379.html


转载自:https://blog.csdn.net/zombres/article/details/82179122

git merge 合并时 --no-ff 的作用——主要影响版本回退(好文章!)相关推荐

  1. git merge合并时遇上refusing to merge unrelated histories的解决方案

    如果git merge合并的时候出现refusing to merge unrelated histories的错误,原因是两个仓库不同而导致的,需要在后面加上--allow-unrelated-hi ...

  2. git merge(git pull)合并时遇上refusing to merge unrelated histories的解决方案

    如果git merge合并的时候出现refusing to merge unrelated histories的错误,原因是两个仓库不同而导致的,需要在后面加上–allow-unrelated-his ...

  3. 【git】git merge 合并分支时遇上refusing to merge unrelated histories的解决方案

    今天在合并分支提示"refusing to merge unrelated histories"的错误: 原因:由于两个分支拥有不相关的提交历史,所以是拒绝合并的,如果确实需要合并 ...

  4. git merge 合并分支时遇上refusing to merge unrelated histories的解决方案

    文章目录 前言 方法一.合并分支时允许合并不相关的历史 方法二.使用 git reset --hard 命令将feature分支覆盖到master分支 前言 最近一个从其他地方迁入公司自己git服务的 ...

  5. git merge合并原则

    git merge命令作用是将某个分支的内容合并到另一个分支,在合并时有可能会发生冲突,这个时候需要手动解决冲突之后进行提交,才能完成合并 本文主要讲合并原则,以及什么时候会发生冲突 场景描述 假设现 ...

  6. 解决冲突后,git merge --continue 时 lint不通过

    一.背景 合并后,解决冲突,然后想继续合并 git merge --continue 报错: ¯_(ツ)_/¯.... 二.解决 尝试: git merge --continue --no-verif ...

  7. git merge合并分支解决冲突

    Question:                                                                                           ...

  8. Git分支合并时显示输入合并备注

    提示:Please enter a commit message to explain why this merge is necessary 解决方法: 按 i 进入insert模式 填入合并备注( ...

  9. git merge合并分支后冲突conflict

    1.现象: Automatic merge failed; fix conflicts and then commit the result. 2.解决方法: 把源码中冲突的部分,删的删,改的改,合并 ...

最新文章

  1. json转java对象_json转java对象
  2. JAX-WS Web Service
  3. java有 号_JAVA揭竿而起总要有名号
  4. 查询指定范围内数据记录(适用于sqlserver2005以上)
  5. 推荐系统相关资源汇总
  6. oracle10g 操作系统,各版本操作系统ORACLE 10g 下载(包括windows和linux)
  7. Python游戏开发实战:飞机大战(含代码)
  8. ISO9660文件系统分析
  9. DCDC电路PCB Layout技巧
  10. Mac如何破解管理员密码
  11. 10分钟带你进入Swagger的世界,快来看一看吧
  12. 法定节假日加班没给三薪是不是犯法的
  13. springboot Basic Auth 暴露API 访问认证
  14. 关于FileZilla连接FTP站点上传下载文件
  15. (E4)ENVI-met运行结果处理
  16. codeup墓地目录(算法笔记习题刷题笔记)
  17. jlink烧写linux内核,如何利用JLINK烧写U-boot到NAND Flash中
  18. 快速搭建APP的服务器
  19. 2. 编写程序,求 x+xx+xxx+……(例如:8+88+888+……)前 n 项之和。x 和 n 的值由 用户从键盘输入。
  20. c#接口是什么,为什么要用接口

热门文章

  1. Ubuntu解决搜狗输入法乱码
  2. Linux命令之nc命令
  3. Quartz学习之Cron表达式详解
  4. 403 Forbidden You don‘t have permission to access this resource. Apache Server at IP Port 80的解决方法
  5. android 讯飞语音引擎3.0默认粤语播报
  6. linux 查看tdagent进程,Fluentd (td-agent) 日志收集系統
  7. python面试题整活:另类复制粘贴
  8. [附源码]Java计算机毕业设计SSM房屋中介管理信息系统
  9. 来自京东、宅急送对微服务编排、API网关、持续集成的实践分享(下)
  10. Lua下的ECS框架