GIT学习笔记(3):分支管理

何谓分支

GIT是如何存储数据的

  GIT不是存储文件差异或者变化量,而是一系列文件的快照。在Git提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,它大概是这样子的。

    

  三个表示文件快照内容的 blob 对象;一个记录着目录树内容及其中各个文件对应 blob 对象索引的 tree 对象;以及一个包含指向 tree 对象(根目录)的索引和其他提交信息元数据的 commit 对象。

  多个提交对象之间是链接关系,每个提交对象会指向上一个提交对象,如下图所示:

  

引入分支

  Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。

  

创建一个新分支

  创建一个新的分支很简单,比如新建一个testing分支,可以使用命令git branch testing,此时将会有两个分支指向当前commit对象。

  

  那么,Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。它是一个指向你正在工作中的本地分支的指针(将 HEAD 想象为当前分支的别名。)。我们创建了新的分支,但是并不会自动切换到这个分支中去,所以我们依然在master分支中进行,我们可以使用git checkout testing命令,来转换到新建的分支中去。

    

  之后每次提交,HEAD将随着分支一起向右移动,如下图所示HEAD跟随testing进行移动。

  

  当然,我们可以使用checkout切换回matser分支,这样再次提交就会产生不同的流向

  

分支的合并

通过上面内容,我们已经理解了分支的基本概念已经分支的新建切换步骤等等,下面我们来探讨一下分支的合并。

分化分支的合并

  如下图所示,hotfix分支是master分支的分化分支,所谓分化,既是源于master,matser是其父级。      

  

  hotfix做了一些操作后,比如修复BUG,master认为hotfix修复了其关键故障,想合并hotfix分支,我们可以回到master,然后指向git merge hotfix命令。

  

  此时发现master和hotfix指向了同一个commit对象。由于 master 分支所在的提交对象是要并入的 hotfix 分支的直接上游,Git 只需把 master 分支指针直接右移。换句话说,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)。

  

  这个时候,hotfix已经完成了历史使命,可以删掉了,使用git branch -d hotfix可以删除不用的分支

  

反思:看到这里我们可以想一下实际的业务场景,比如我们matser版本出现问题,我们可以先创建一个新的分支进行修改,如果修复成功了,master合并即可,即使没有成功,也不会对master有任何影响。

基于共同祖先的合并

  比如maste分支r想要合并iss53分支,由于当前 master 分支所指向的提交对象(C4)并不是 iss53 分支的直接祖先,Git 不得不进行一些额外处理。就此例而言,Git 会用两个分支的末端(C4 和 C5)以及它们的共同祖先(C2)进行一次简单的三方合并计算

  即如下图所示:

    

  这次,Git 没有简单地把分支指针右移,而是对三方合并后的结果重新做一个新的快照,并自动创建一个指向它的提交对象(C6)

  

  既然之前的工作成果已经合并到 master 了,那么 iss53 也就没用了。你可以就此删除它。

遇到冲突时的分支合并

  有时候合并操作并不会如此顺利。如果在不同的分支中都修改了同一个文件的同一部分,Git 就无法干净地把两者合到一起,比如我们合并master与tesing分支。

  

  此时会出现问题,因为他检测出来两个分支都对Test.java进行了操作,他对Test.java进行了合并,但没有提交,它会停下来等你解决冲突。打开Test.java文件,我们发现它自动的把两者的内容放在一起,让我们做出选择

  

  我们自行做出修改,然后运行git add将其表示为已经解决状态,最后提交即可。

  

  到这里分支管理的基础内容已经讲完了,关于远程分支等内容我们将在下篇文章中详细说明,谢谢关注!

GIT学习笔记(3):分支管理的更多相关文章

  1. Git学习笔记五--分支管理

    为什么要引入分支? 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了.如果等代码全部 ...

  2. git学习笔记08-分支管理策略-实际上我们应该怎么应用分支

    Git用Fast forward模式(快进模式),但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支 ...

  3. git 学习笔记 --Bug分支

    软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一 ...

  4. git学习4:分支管理

    每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,这个分支叫主分支,即master分支,HEAD指向master,master指向提交,所以,HEAD指向的就 ...

  5. 【Git】笔记4 分支管理1

    1.创建与合并分支 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点: 每次提交,master分支都会向 ...

  6. git学习笔记09-bug分支-自己的分支改到一半了-要去改bug怎么办?

    当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交: 并不是你不想提交,而是工作只进行到一半,还没法 ...

  7. 【Git】笔记5 分支管理2

    来源:廖雪峰 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一 ...

  8. git学习笔记12-标签管理-版本

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照 ...

  9. git 学习笔记--Feature分支

    软件开发中,总有无穷无尽的新的功能要不断添加进来. 添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合 ...

随机推荐

  1. PAT002 Reversing Linked List

    题目: Given a constant K and a singly linked list L, you are supposed to reverse the links of every K ...

  2. 从以下哪一个选项中可以获得Servlet的初始化参数。

    从以下哪一个选项中可以获得Servlet的初始化参数. A.Servlet B.ServletContext C.ServletConfig D.GenericServlet 解答:C servlet ...

  3. js事件循环机制(Event Loop)

    javascript从诞生之日起就是一门  单线程的  非阻塞的  脚本语言,单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务,非阻塞靠的就是 event lo ...

  4. 【转】Windows Dump文件获取

    dump文件是进程的内存镜像.可以把程序的执行状态,即当时程序内存空间数据通过调试器保存到dump文件中. 1.利用WinDbg里的adplus来获取dump文件 Adplus.vbs 是一个Visu ...

  5. Tomcat unable to start within 45 seconds.

    解决的方法当然是设定这个时间,让其大于45秒,修改在当前项目所在的workspace\.metadata\.plugins\org.eclipse.wst.server.core\servers.xm ...

  6. 如果 date_field = TRUNC(date_field) 就说明时分秒为0(也就是不包含),否则就包含时分秒

    如果 date_field = TRUNC(date_field) 就说明时分秒为0(也就是不包含),否则就包含时分秒

  7. iOS-本地沙盒路径

    沙盒几个路径: 沙盒里的文件夹包括Documents.Library.tmp.这三个文件夹的作用请点击这里.接下来我们来讲解如何获取Documents.Library.tmp的路径. 获取沙盒根目录 ...

  8. ORA-00257错误的解决办法

    author: headsen  chen date: 2018-04-17  11:12:39 notice:个人原创,转载请注明作者和出处,否则依法追击法律责任. 1,oracle数据库正常使用中 ...

  9. jQuery 对象访问 index([selector|element])

    搜索匹配的元素,并返回相应元素的索引值,从0开始计数. 如果不给 .index() 方法传递参数,那么返回值就是这个jQuery对象集合中第一个元素相对于其同辈元素的位置. 如果参数是一组DOM元素或 ...

  10. [cocos2dx] cocosdx编译工程那些事

    cocos compile -p android 上面这条命令可以将cocos2dx的工程编译出android apk,需要注意的是如果有新增的cpp文件,都需要在“CocosProject\proj ...