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(聚合)的更多相关文章

  1. Git – Fast Forward 和 no fast foward

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

  2. Git Fast Forward 和 no fast foward

    如果执行了 Fast Forward,开发者根本不会看到这个分支,就像在 master 直接 commit 一样.

  3. git merge之squash

    看CM源码时,发现历史记录里有很多squash,于是google了解了一下. Git相对于CVS和SVN的一大好处就是merge非常方便,只要指出branch的名字就好了,如: 1 2 3 4 5 $ ...

  4. 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 ...

  5. 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 ...

  6. 新同事,git又报错Please move or remove them before you merge

    http://blog.csdn.net/hufengvip/article/details/17231133 下面一行搞定 git clean -d -fx ""

  7. [Git] git merge之squash

    reference : https://www.cnblogs.com/ungshow/p/3515161.html 看CM源码时,发现历史记录里有很多squash,于是google了解了一下. Gi ...

  8. 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, ...

  9. 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 #### 将 ...

随机推荐

  1. 01-Git简介和仓库创建

    Git简介 Linus的第二个伟大作品.2005年由于BitKeeper软件公司对Linux社区停止了免费使用权.Linus迫不得己自己开发了一个分布式版本控制工具,从而Git诞生了. 目前使用Git ...

  2. Cell自适应高度及自定义cell混合使…

    第一部分:UItableViewCellAdaptionForHeight : cell的自适应高度 第二部分:CustomTableViewCell:自定义cell的混合使用(以简单通讯录为例) = ...

  3. javascript之DOM编程设置节点插入节点

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. JSP编译成Servlet(三)JSP编译后的Servlet

    JSP编译后的Servlet类会是怎样的呢?他们之间有着什么样的映射关系?在探讨JSP与Servlet之间的关系时先看一个简单的HelloWorld.jsp编译成HelloWorld.java后会是什 ...

  5. CSS引入

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Android热插拔事件处理详解

    一.Android热插拔事件处理流程图 Android热插拔事件处理流程如下图所示: 二.组成 1. NetlinkManager:        全称是NetlinkManager.cpp位于And ...

  7. 在Windows下搭建Gitlab服务器

    一.GitLab简介 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 可通过Web界面进行访问公开的或者私人项目.它拥有与Github类 ...

  8. RAC 10g administration

    10g RAC administration See OCFS Oracle Cluster Filesystem, ASM, TNSnames configuration, Oracle Datab ...

  9. Eclipse集成Android_NDK

         Eclipse集成Android NDK说明 2          为什么要用NDK? 以下内容引用自<Pro Android Games> Some Java develo ...

  10. netty对http协议解析原理解析

    本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...