git merge和git merge --no-ff的区别 图解易懂

在很多介绍GItFlow工作流的文章里面,都会推荐在合并分支的时候加上--no-ff参数, 而我们在合并的时候,有时git也会提示 使用了 fast-forward, 这里我将介绍一下merge的三种状态及 git merge 和 git merge --no-ff 的区别

Git merge的时候,有几种合并方式可以选择

--ff
When the merge resolves as a fast-forward, only update the branch pointer, without creating a merge commit. This is the default behavior.

--no-ff
Create a merge commit even when the merge resolves as a fast-forward. This is the default behaviour when merging an annotated (and possibly signed) tag.

--squash
--no-squash
Produce the working tree and index state as if a real merge happened (except for the merge information), but do not actually make a commit, move the HEAD, or record $GIT_DIR/MERGE_HEAD (to cause the next git commit command to create a merge commit). This allows you to create a single commit on top of the current branch whose effect is the same as merging another branch (or more in case of an octopus).

With --no-squash perform the merge and commit the result. This option can be used to override --squash.

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

看过官方注释后,我们用一张图来简单描画一下相应的行为

 

 

fast-forward

Git 合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,叫做“快进”(fast-forward)不过这种情况如果删除分支,则会丢失merge分支信息。

–squash

把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。

–no-ff

关闭fast-forward模式,在提交的时候,会创建一个merge的commit信息,然后合并的和master分支
merge的不同行为,向后看,其实最终都会将代码合并到master分支,而区别仅仅只是分支上的简洁清晰的问题,然后,向前看,也就是我们使用reset 的时候,就会发现,不同的行为就带来了不同的影响

 

 

上图是使用 merge --no-ff的时候的效果,此时git reset HEAD^ --hard 的时候,整个分支会回退到 dev2-commit-2

 

 

上图是使用 fast-forward 模式的时候,即 git merge ,这时候 git reset HEAD^ --hard,整个分支会回退到 dev1-commit-3

通常我们把 master 作为主分支,上面存放的都是比较稳定的代码,提交频率也很低,而 develop 是用来开发特性的,上面会存在许多零碎的提交,快进式合并会把 develop 的提交历史混入到 master 中,搅乱 master 的提交历史。所以如果你根本不在意提交历史,也不爱管 master 干不干净,那么 –no-ff 其实没什么用。不过,如果某一次 master 出现了问题,你需要回退到上个版本的时候,比如上例,你就会发现退一个版本到了 commint-3,而不是想要的 commit-2,因为 feature 的历史合并进了 master 里。这也就是很多人都会推荐 –no-ff 的原因了吧。

版权声明:本文为qq_40259641原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40259641/article/details/102785419

智能推荐

百度某新员工(应届生)抱怨:前人代码写得像坨*,颠覆了对大厂的认知

来源:网络 一位百度新员工刚入职一周,看了前人的代码,估计没有压住内心的那一团烈火,直接在脉脉开喷... 在脉脉上发这种帖子,很显然,要么被顶,要么被别人喷。 支持者表示,这坨**是一样的味道 有很多屎一样的老项目,但等你去其他厂,你可能会发现这坨屎居然有点香; 等你准备重构这代码的时候,你会发现这屎冲了厕所就塌了; 新人总觉得别人是屎;当你离职时回顾自己的遗产,发现也是一坨屎; 似乎刚入职的新人...

SwitchHosts提示"切换hosts失败!没有修改'C:\WINDOWS\system32\drivers\etc\hosts'的权限问题

1.根据将地址粘贴到窗口进行搜索找到"hosts"文件 地址: 2.鼠标放在hosts文件上右键属性 3.查看常规窗口底下"属性"有没有勾选"只读",如果勾选了"只读",请把勾去掉进行保存,然后操作下面的步骤。 (4)、如果去掉勾还是不行的话,那就把这个文件复制一份到其他盘,然后把原本的删掉,再把之前粘贴到其他的盘相同...

flowable学习(Ⅰ) --- 创建一个简单的flowable流程例子

特点/优点: 所有操作都是同步的,并处于同一个事务下。 自动存储所有流程实例的审计数据或历史数据 创建简单的maven项目 1. 创建一个简单的flowable项目 添加依赖 创建表 我使用的是mysql8以上版本创建表的时候需要指定useUnicode=true&characterEncoding=utf8,否则报异常getCharacter异常, serverTimezone=GMT%...

Angular4记账webApp练手项目之三(在angular4项目中使用路由router)

Angular4记账webApp练手项目之一(利用angular-cli构建Angular4.X项目) Angular4记账webApp练手项目之二(在angular4项目中使用Angular WeUI) Angular4记账webApp练手项目之三(在angular4项目中使用路由router) Angular4记账webApp练手项目之四(在Angular4项目中用echarts绘制图表) A...

HTML:Android中软键盘显示时,底部固定导航上顶的解决方案

1、解决方案 软键盘显示时,底部导航使用css 中 top 进行固定。 top = 浏览器可视区域高度 - 底部固定导航高度 2、代码 jQuery...

猜你喜欢

IDEA安装配置Scala并编写HelloWord程序

由于本篇文章是为了在Windows下的IDEA搭建Spark环境做准备,因此Scala的版本要与Spark相匹配(这里Spark我用的是2.4.4,Scala用的是2.12.10) 一、首先先在Windows环境下配置JDK和Scala的环境变量,这里不再一一阐述,很简单的。 二、安装IDEA(可参考我安装IDEA的文章) 三、在IDEA中安装Scala插件 这里分为手动安装和自动安装 (1)自动...

在Anaconda中如何添加新环境tensorflow以及配置opencv等教程(win10)

万事开头难,经过本人多次实验之后总结如下的经验,主要是用于指导像我这样的小白如何入门Anaconda的。首先建议大家去官网下载Anaconda最新版本,毕竟是开源的所以就不要说到某某免费网站下载**版什么的了。那么这里附上Anaconda入门的指导手册网页吧!!!(这是在官网里转过来的)https://docs.anaconda.com/anaconda/user-guide/getting-st...

计算机网络知识汇总

  https://github.com/duoduo18/note-of-interview   OSI(开放系统互联参考模型)标准模型 物理层 负责为数据端设备透明地传输原始比特流,并且定义了数据终端设备和数据通信设备的物理和逻辑链接方法。传输单位是比特。 协议:RJ45、CLOCK、IEEE802.3 设备:(中继器,集线器) 数据链路层 将网络层传下来的IP数据报组装成...

maven如何把本地jar包一起打包到war

1. 项目根目录新建lib文件夹,jar包放入 2.在pom里引入本地文件 3.此时刷新pom后,应该就可以识别jar,运行项目,不行的话按下图操作: 先选中jar,在add as library 4.如果你要打包的,现在是报错的,找不到程序包,需要在pom里添加插件: 5.现在就可以打包成功了。 6.如果你出现 java:-source 1.7中不支持方法,需要家检查一下几项是否是ja...

手链的组合

要参加蓝桥杯比赛了 就去刷几个真题找找感觉 直接暴力枚举手链的组合方式 每找出一种就放进vector内 难点在于可以转动可以反转 转动就是首尾相连嘛 所以直接加倍长度 那每种转动方式就都可以找到字串了 反转的话正反翻过来 直接逆序储存就好了...