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 #### 将 ...
随机推荐
- 常用js总结
通过radio来显示/隐藏一个div <div id="ArbAcei" > <br/> 有无不良反应停药 <input type="rad ...
- 《java入门第一季》之根据小案例体会泛型
泛型在哪些地方使用呢? * 看API,如果类,接口,抽象类后面跟的有<E>就说要使用泛型.一般来说就是在集合中使用. 下面根据案例,加深体会泛型的作用. 案例一: import java. ...
- Gradle 1.12 翻译——第十二章 使用Gradle 图形用户界面
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- Linux的资源管理器
说是资源管理器,其实就是使用命令来对Linux运行系统的参数的查看.下面就一起看一看怎么像在windows下查看资源管理器吧. 1.查看进程(额,自然是电脑上正在运行的进程咯) ps aux 其中a ...
- gcov 统计 inline 函数
gcov 统计 inline 函数 (金庆的专栏) gcov可以统计 inline 函数,可是实际使用中碰到统计次数总是为0的现象. 假设类A的头文件为 A.h, 实现文件为 A.cpp. A 有几 ...
- jquery easyui datagrid 分页实现---善良公社项目
接着上篇文章,接下来给大家分享分页的实现,分页其实多多少少见过很有几种,框架中带的图片都特别的好看,会给用户以好的使用效果,具体实现,需要自己来补充代码: 图示1: 通常情况下页面数据的分页显示分成真 ...
- 【一天一道LeetCode】#80. Remove Duplicates from Sorted Array II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...
- clisp, scheme 和 clojure 初学习
clisp, scheme和clojure 初学习 1 clojure "clojure绝对会成为你的编程工具箱里的终极武器" "其他语言可能只是工具,但 Clojure ...
- Css的学习之旅-css的选择器(2)
1.最常用的是派生选择器:eg:ul li{ color:red} 2.id选择器:eg:#id{color:red} 3.类选择器:设置标签的class = "",类似id.用点 ...
- android Google推荐的容器SparseArrayCompat简介
android Google推荐的容器SparseArrayCompat简介 private static SparseArrayCompat<BaseFragment> mCaches ...