Git的fast forward和no fast forward和 three way merge 以及squash(聚合)
github上上传了版本库https://github.com/ChuckGitMerge 包括merge和rebase
没时间画图,貌似也不太会用画图工具,先写了一个文字版本的
更新:2015年08月11日,使用了git for windows自带的git gui作为图片说明
一、Fast Forward,No Fast Forward 和 Squash的对比
1.fast forward
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
现在切回master分支,将develop分支合并到master。默认使用fast forward,master分支会直接指向C5。master分支的节点为C1,C2,C3,C4,C5
develop分支和master分支,看起来是完全一样的
2.no fast forward
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
现在切回master分支,将develop分支合并到master。如果使用no fast forward,在master分支上会生成一个新的commit为C6。master分支的节点为C1,C2,C3,C4,C5,C6
3.squash(第一种)
第一种squash,develop分支切出之后,master分支没有新的提交
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
下面的图的情况和fast forward以及no fast forward处理之前是一样的
现在切回master分支,将develop分支合并到master。
如果使用聚合的方式进行合并的话,那么git会将develop分支上所有的commit压缩成一个新的commit为C6直接合并到master分支。
最后master分支上的节点为C1,C2,C3,C6
从版本库的分支历史记录,是无法看出develop合并到master分支上的记录的。这是squash和其他合并方式的最主要的区别。
并且master和develop还保持着相互独立
二、Three Way Merge和Squash的对比
1.three way merge
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
master分支在C3的基础上开发了C6,C7这样进行合并的话,是无法fast forward的。
合并方式:1.找到master分支的最新节点C7
2.找到develop分支的最新节点C5
3.找到master分支和develop分支的共同祖先节点C3
4.对C3,C5,C7进行三方合并,最后生成新的commitC8
2.squash(第二种)
第二种squash,develop分支切出之后,master分支也有了新的提交
假设从master分支有三个节点C1,C2,C3
从C3切出develop分支,并在develop分支上开发了C4,C5
master分支在C3的基础上开发了C6,C7这样进行合并的话
下面的图的情况和three way merge处理之前是一样的
合并方式,直接把develop上的2个结点的变化提取出来,然后直接应用在master分支上。
从版本库的分支历史记录,是无法看出develop合并到master分支上的记录的。这是squash和其他合并方式的最主要的区别。
并且master和develop还保持着相互独立
参考资料
http://www.open-open.com/lib/view/open1328069889514.html git详解之三 git分支
http://ariya.ofilabs.com/2013/09/fast-forward-git-merge.html Fast-Forward Git Merge
http://stackoverflow.com/questions/2850369/why-does-git-fast-forward-merges-by-default
Git的fast forward和no fast forward和 three way merge 以及squash(聚合)的更多相关文章
- Git – Fast Forward 和 no fast foward
Git 很是强大,在体验过rebase的华丽之后,再次发现之前在TFS上遇到的问题一下都有解了.但也印证了Git深入并非易事.这篇就谈下一个容易迷糊的概念:Fast forward. Fast-For ...
- Git Fast Forward 和 no fast foward
如果执行了 Fast Forward,开发者根本不会看到这个分支,就像在 master 直接 commit 一样.
- git merge之squash
看CM源码时,发现历史记录里有很多squash,于是google了解了一下. Git相对于CVS和SVN的一大好处就是merge非常方便,只要指出branch的名字就好了,如: 1 2 3 4 5 $ ...
- Git的commit your changes or stash them before you can merge
今天用git pull来更新代码,遇到了下面的问题: error: Your local changes to the following files would be overwritten by ...
- git中Please enter a commit message to explain why this merge is necessary.
Please enter a commit message to explain why this merge is necessary. 请输入提交消息来解释为什么这种合并是必要的 git 在pul ...
- 新同事,git又报错Please move or remove them before you merge
http://blog.csdn.net/hufengvip/article/details/17231133 下面一行搞定 git clean -d -fx ""
- [Git] git merge之squash
reference : https://www.cnblogs.com/ungshow/p/3515161.html 看CM源码时,发现历史记录里有很多squash,于是google了解了一下. Gi ...
- Git 解决方案 commit your changes or stash them before you can merge
error: Your local changes to the following files would be overwritten by merge: *********** Please, ...
- git冲突处理-Please move or remove them before you can merge
参考:https://www.cnblogs.com/wenlj/p/5866356.html https://my.oschina.net/lixiaoyan/blog/1821947 #### 将 ...
随机推荐
- Android的actionBar的菜单使用-android学习之旅(四十三)
ActionBar简介 ActionBar是3.0以后加入的新特性,可用于在顶部显示应用名称和标题.初次之外右边还可以显示活动项. ActionBar应用 ActionBar用法 <?xml v ...
- RAMCloud:内存云存储的内存分配机制
现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX-F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业 ...
- [Err] 1093 - You can't specify target table 's' for update in FROM clause
[Err] 1093 - You can't specify target table 's' for update in FROM clause 执行SQL DELETE from book WHE ...
- 【TCP/IP 协议】 TCP/IP 基础
总结 : 通过学习 TCP/IP 基础, 并总结相关笔记 和 绘制思维导图 到博客上, 对 TCP/IP 框架有了大致了解, 之后开始详细学习数据链路层的各种细节协议, 并作出笔记; 博客地址 : h ...
- Guava 教程1-使用 Google Collections,Guava,static imports 编写漂亮代码
原文出处: oschina (API:http://ifeve.com/category/framework/guava-2/ JAR DOC Source 链接:http://pan.baidu.c ...
- javascript之BOM地址栏对象(Location)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 《java入门第一季》之Random类和获取随机数案例
/* * Random:产生随机数的类 * * 构造方法: * public Random():没有给种子,用的是默认种子,是当前时间的毫秒值下的随机数,所以会一直变化 * public ...
- Oracle中job的实例
一.Oracle定时器(Job)各时间段写法汇总 对于DBA来说,数据库Job再熟悉不过了,因为经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等 ...
- H5学习之旅-H5的超链接以及图片链接(6)
链接内容 1.文本链接 2.图片链接 属性 href:指向另一个文档的链接 name:文档内部的链接 img标签属性 alt:替换文本属性 width:宽 height:高 代码实例 <!DOC ...
- Leetcode_168_Excel Sheet Column Title
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42554641 Given a positive integ ...