merge
 
    git merge是我们要学习的合并工作的第一个方法。合并产生一个特殊的提交记录,它包含两个唯一父提交。有两个父提交的提交记录本质上是:“我想把这两个父提交本身及它们的父提交集合都包含进来。”
   
1. 有共同祖先,但非直接上下游关系的分支
    
    根据C1、C2、C3这三个提交对象(C1是C2、C3的共同祖先),合并之后,生成了一个新的提交对象,包含了两个父提交。假如从合并后的master出发,开始沿着箭头向上游走,在到达起点的路上会经过所有的提交记录,这说明master包含了所有代码库的修改。
2. 直接上下游分支关系
    可以看出,合并只是将bugFix分支移动到上游的master分支,使得bugFix和master指向同一提交对象。
 
   分支合并情况有多种,一种是当前master分支所指向的提交对象为新建分支的直接祖先,一种则不是。
    第一种情况的合并比较简单,合并时,只需要前移master指针使它指向新建分支所指向的commit对象。这种情况下,如果在master和新建分支之间还有多个直接祖先为master的分支,直接和最新的合并,那么如果再和上游的分支合并,会提示already up-to-date。如果合并的是上游的,那么可以一步一步合并到最新的分支。
    第二种情况的合并比较复杂,因为当前master分支所指向的commit对象不是新建分支的直接祖先,Git不得不进行一些额外的处理,一般会取新建分支所指向的commit、master所指向的commit和新建分支和master的共同祖先所指向的commit这三个对象合并为一个新的commit对象,并生成结果的文件快照,该文件快照是一些合并时被修改的文件快照。
 
(2)Git会自动选取合适的新建分支和master的共同祖先作为合并基础,这一点和CVS和subversion的人工选择不同,极大的简化操作流程。
 
rebase
 
    rebasing是在分支之间合并工作的第二种方法。Rebasing就是取出一系列的提交记录,"复制"它们,然后把在别的某个地方放下来。虽然听上去难以理解,rebasing 的优势是可以创造更线性的提交历史。假如只允许使用rebasing,代码库的提交日志/历史会更好看。
    简单地说下上面的三张图片所演示的效果和作用。开始,master分支和bugFix分支中的修改是唯一独立的,现在想要把bugFix分支里的修改直接移动到master分支中。在bugFix分支中,使用git rebase master命令,复制bugFix的最新提交对象,然后把它放在master分支的最新提交对象的后面,得到了一个更加线性好看的提交记录,此时bugFix是master的上游,应注意原来被复制的提交对象仍在、不会消失;现在唯一的问题是master分支还没有更新。接下来切换到master分支,把它rebase到bugFix分支,git rebase bugFix,因为master是bugFix的直接下游,所以Git只把master分支的记录前移到bugFix上而已。
    rebase时候,git做了些什么呢?
    1. 先将master分支的代码checkout出来,作为工作目录
    2. 然后将bugFix分支从master分支创建起的所有改变的补丁,依次打上。如果打补丁的过程没问题,rebase就搞定了
    3. 如果打补丁的时候出现了问题,就会提示你处理冲突。处理好了,可以运行git rebase –continue继续直到完成
    4. 如果你不想处理,你还是有两个选择,一个是放弃rebase过程(运行git rebase –abort),另一个是直接用test分支的取代当前分支的(git rebase –skip)。
 
最后补一下 有关rebase的知识:
                                 
 #将当前分支切换到mywork
git checkout mywork
git rebase origin
    
    
    这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新到最新的"origin"分支(即"mywork"分支引用移动到origin上),最后把保存的这些补丁应用到"mywork"分支上。当'mywork'分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除.

使用rebase和merge之后的区别:

【原创】Git 分支的合并【Learn Git Branching】的更多相关文章

  1. git分支的合并

    原文: http://gitbook.liuhui998.com/3_3.html http://gitbook.liuhui998.com/5_3.html 一.如何分支的合并 在git中,可以使用 ...

  2. 【git】git分支的合并

    原文: http://gitbook.liuhui998.com/3_3.html http://gitbook.liuhui998.com/5_3.html 一.如何分支的合并 在git中,可以使用 ...

  3. git分支的合并和冲突解决【转】

    本文转载自:http://blog.csdn.net/Kingson_Wu/article/details/39227611 http://gitbook.liuhui998.com/3_3.html ...

  4. git 那些事儿 —— 基于 Learn Git Branching

    前言 推荐一个 git 图形化教学网站:Learn Git Branching,这个网站有一个沙盒可以直接在上面模拟 git 的各种操作,操作效果使用图形的方式展示,非常直观.本文可以看作是它的文字版 ...

  5. Git -- 分支与合并 (命令行+可视化工具p4merge)

    基本命令 把所有的变化都放在master分支并不是最好的做法. 建议的做法是把变化放在分支里面. 至少应该准备一个feature分支之类的, 把变化都隔离开来, 然后等到所有的功能都稳定之后再合并到m ...

  6. git分支branch合并到主分支master

    如何使用git将分支branch合并到主干master上 对于一人独立使用git进行系统开发时,branch分支相当于版本(Version),如果每次都将新的分支branch提交到GitHub上,则会 ...

  7. idea中git分支、合并与使用

    1.分支的新建与合并使用场景介绍 让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流. 你将经历如下步骤: 开发某个网站. 为实现某个新的需求.问题(#53问题),创建一 ...

  8. mac下sourcetree创建git分支和合并分支

    git默认创建的分支为:master主分支 要实现的效果:新建和合并分支. 1.在master基础上创建分支v1.0.1并切换至v1.0.1然后推送分支到远程服务器 确定即可!! 然后查看远端已经发现 ...

  9. git的学习笔记(一):git本地操作

    1.Git介绍 Git是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理. Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发. Git ...

随机推荐

  1. 初学者必看的文章:在VM12中安装 RedHat RHEL7.2  系统的详细步骤:看我如何操纵RHEL系统

    一.开始安装 1)新建虚拟机 RHEL7.2 2)成功引导系统--开机出现此画面 Install Red Hat EnterpriseLinux 7.2  安装RHLE7.2 操作系统 Test th ...

  2. drools规则引擎中易混淆语法分析_相互触发导致死循环分析

    整理了下最近在项目中使用drools出现的问题,幸好都在开发与测试阶段解决了,未波及到prod. 首先看这样两条规则: /** * 规则1_set默认利率a */ rule "rate_de ...

  3. python按照指定字符或者长度 截取字符串

    1.截取指定位置字符串 Python字符串可以理解为一个数组,获取某一部分的可以使用 str[beginIndex:endPosition],其中str为需要截取的字符串,beginIndex为需要截 ...

  4. 微信小程序------加导航

    效果图如下 这个其实很简单 在app.json上面加点代码 "window":{ "backgroundTextStyle":"light" ...

  5. 2019/3/1 IO流的学习总结

    Java学习之IO流 学习Io流之前,我们先了解文件,以及在Java中对文件的操作.首先对文件进行操作,就必须用 File F = new File(“d:\\文件名”); 表示该文件或文件夹的地址寻 ...

  6. FPGA跨时钟域握手信号的结构

    FPGA跨时钟数据传输,是我们经常遇到的问题的,下面给出一种跨时钟握手操作的电路结构.先上图 先对与其他人的结构,这个结构最大的特点是使用 req 从低到高或者高到低的变化 来表示DIN数据有效并开始 ...

  7. 包建强的培训课程(8):iOS与设计模式

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  8. 如何用kaldi做孤立词识别二

    基本模型没有变化,主要是调参,配置: %WER     65%  下降到了     15% 后面再继续优化... Graph compilation finish!steps/decode.sh -- ...

  9. 【webpack】流行的前端模块化工具webpack初探

    从开发文件到生产文件   有一天我突然意识到一个问题,在使用react框架搭建应用时,我使用到了sass/less,JSX模版以及ES6的语法在编辑器下进行开发,使用这些写法是可以提高开发的效率.可是 ...

  10. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...