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 #### 将 ...
随机推荐
- 01-Git简介和仓库创建
Git简介 Linus的第二个伟大作品.2005年由于BitKeeper软件公司对Linux社区停止了免费使用权.Linus迫不得己自己开发了一个分布式版本控制工具,从而Git诞生了. 目前使用Git ...
- Cell自适应高度及自定义cell混合使…
第一部分:UItableViewCellAdaptionForHeight : cell的自适应高度 第二部分:CustomTableViewCell:自定义cell的混合使用(以简单通讯录为例) = ...
- javascript之DOM编程设置节点插入节点
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JSP编译成Servlet(三)JSP编译后的Servlet
JSP编译后的Servlet类会是怎样的呢?他们之间有着什么样的映射关系?在探讨JSP与Servlet之间的关系时先看一个简单的HelloWorld.jsp编译成HelloWorld.java后会是什 ...
- CSS引入
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Android热插拔事件处理详解
一.Android热插拔事件处理流程图 Android热插拔事件处理流程如下图所示: 二.组成 1. NetlinkManager: 全称是NetlinkManager.cpp位于And ...
- 在Windows下搭建Gitlab服务器
一.GitLab简介 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 可通过Web界面进行访问公开的或者私人项目.它拥有与Github类 ...
- RAC 10g administration
10g RAC administration See OCFS Oracle Cluster Filesystem, ASM, TNSnames configuration, Oracle Datab ...
- Eclipse集成Android_NDK
Eclipse集成Android NDK说明 2 为什么要用NDK? 以下内容引用自<Pro Android Games> Some Java develo ...
- netty对http协议解析原理解析
本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...