1.分支简介

  几乎所有的版本控制系统都支持某种形式的分支。使用分支意味着可以把你的工作从开发主线上分离开来,以免影响开发主线。Git的分支是其必杀技,它相对于其它版本控制系统来说,具有难以置信的轻量性,创建分支以及切换分支几乎都是瞬间完成。Git鼓励频繁的使用与合并分支。

  Git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。

  在进行commit操作的时候,Git会保存一个提交对象(commit object),该对象包含一个指向暂存内容快照的指针,包含指向父commit对象的指针,以及提交者的名字,提交信息等。首次提交的对象没有父对象,普通提交操作产生的提交对象只有一个父对象,合并操作产生的提交对象有多个父对象。

  暂存操作(git add)会计算每一个文件的校验和(也就是一个hash值,Git使用的hash算法是SHA-1),然后将当前版本的文件快照保存在Git仓库中(Git使用blob对象来保存它们),最终将校验和加入到暂存区域等待提交。

  当执行git commit操作的时候,Git会计算每一个目录的校验和,然后在Git仓库中将这些校验和保存为树对象。git commit创建的提交对象包含指向树对象(项目根目录对应的树对象)的指针。

  如上图所示,一个项目有一个根目录,其对应的tree对象的校验和是y46r5,根目录下面有三个子目录,对应的树对象的校验和分别为t5re4、h65er、hn63u,每个目录下面有一些文件,Git将其保存为blob对象,每个文件对应于一个blob对象,同时也知道每个文件的校验和。这样一来,Git就能够保存项目的树状结构,每一个时刻都有其不同的树状结构,就能够在需要的时候恢复到某一个对应的状态。

  如下图,Git的提交对象包含指向内容快照的指针(hash值)以及指向父提交节点的指针(hash值), 每个快照对应于上图中所有的tree对象和blob对象组成的部分。

  对于commit对象、tree对象、blob对象包含的详细内容,可以参考下图。  每个commit对象包含所指向的tree对象的hash值,每个tree对象包含所指向的blob对象的hash值。

   Git分支的本质实际上只是一个指向提交(commit)对象的可变指针。Git默认分支的名字是master,几乎所有的仓库都有一个master分支,这是由于git init自动创建它,并且大多数人都懒得去修改它。

2.分支创建

  分支的创建本质上只是创建了一个指向提交(commit)对象的指针。

  使用 git branch <branch name> 创建一个分支。这条命令将创建一个指向当前提交对象的分支。

注意:这条命令不会自动切换到新的分支上去。

  那么,Git又是如何知道当前在哪个分支上的呢?Git有一个名为HEAD的指针,它指向当前所在的本地分支(可以将其看作是当前分支的别名)。

  如下图,创建一个testing分支,此时master和testing同时指向校验和以f30ab开头的提交对象,但是HEAD还是指向master,并没有指向testing(因为git branch不会自动切换分支)。

  

  可以使用 git log --decorate 命令查看各个分支当前所指的对象。

3.分支切换

  使用 git checkout <branch-name> 切换分支,其本质上是将HEAD指针指向branch-name指向的分支。例如 git checkout testing 会产生如下图所示结果:HEAD指向了testing分支。

  这时候,在提交(commit)一次,会得到如下图所示的结果:master分支没有向前移动,HEAD所指向的testing分支向前移动了。也就是说当我们执行git commit操作的时候,HEAD指向的分支随着提交操作自动向前移动。

  如果执行git checkout master,这时候Git会做两件事情:1.将HEAD指针指向master;2.将工作区的内容恢复成master所指向的快照内容(也就是master所指向的commit对象所指向的文件快照)。

  注意:分支切换会改变你本地的工作区域的内容。会将本地工作区域的内容恢复到被切换到的分支上最后一个提交时候的样子。

  分支的本质实际上仅是包含所指提交对象的校验和的文件(文件中存储的是所指提交对象的校验和,长度为40的hash字符串)。创建一个分支相当于给文件中写入一个hash字符串,所以创建Git分支相当的高效。

  其它的版本控制系统,在创建分支的时候,会将所有的项目文件都复制一遍,并保存到特定的目录。这会导致其它的版本控制系统的效率非常低效。

7.Git分支-分支简介、分支创建、分支切换的更多相关文章

  1. 分享如何将git项目导入GitHub(附创建分支)

    前言:我们应该很多都会有自己的私有项目,大多情况都是存放在自己的硬盘中,今天我分享一下怎么讲自己的私有项目更新到GitHub上,这样再也不用担心项目丢失了. 一:下载git 下载链接git链接,根据自 ...

  2. [原创]gerrit上分支操作记录(创建分支、删除分支)

    Git分支对于一个项目的代码管理而言,是十分重要的! 许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉. 在此,我将自己的一些操作经历做一梳理,希望能帮助到 ...

  3. Gerrit上分支操作记录(创建分支、删除分支)

    Git分支对于一个项目的代码管理而言,是十分重要的!许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉.在此,我将自己的一些操作经历做一梳理,希望能帮助到有用 ...

  4. git 本地给远程仓库创建分支 三步法

    命令如下: 1:本地创建分支dev Peg@PEG-PC /D/home/myself/Symfony (master) $ git branch dev 2:下面是把本地分支提交到远程仓库 Peg@ ...

  5. 1. git 本地给远程仓库创建分支 三步法

    命令如下: 1:本地创建分支dev 1 2 Peg@PEG-PC /D/home/myself/Symfony (master) $ git branch dev 2:下面是把本地分支提交到远程仓库 ...

  6. git与eclipse集成之创建及切换个人本地分支

    创建个人本地特性分支,并进行编码 弹出选择分支的窗口,选择要切换的个人特性分支(备注:根据远程个人特性分支创建本地个人特性分支) 点击OK,Branch name:分支名称与远程分支名称相同,不需要修 ...

  7. SourceTree 如何下载git 管理的代码-如何创建分支,删除分支,提交代码,回退代码

    把用户给的链接拿过来,然后输入浏览器,然后在左侧会有Actions 中有个Clone;点击Clone之后,有个 Clone in Source Tree 点击,打开你的本地Source Tree,然后 ...

  8. git从指定的commit创建分支

    How do I create a new git branch from an old commit? git checkout -b justin a9c146a09505837ec03b Thi ...

  9. git 创建分支并切换

    git checkout -b fix/base //创建分支 git branch -av 查看所有分支 git checkout master //切换分支

  10. 如何使用git创建项目,创建分支

    git config -global user.name "Your name" git config -global user.email "you@example.c ...

随机推荐

  1. java集合遍历的几种方式总结及比较

    集合类的通用遍历方式, 用迭代器迭代: Iterator it = list.iterator(); while(it.hasNext()) { Object obj = it.next(); }   ...

  2. AspNet Core 下利用普罗米修斯+Grafana构建Metrics和服务器性能的监控 (无心打造文字不喜勿喷谢谢!)

    概述 Prometheus的主要特点 组件 结构图 适用场景 不适用场景 安装node_exporter,系统性能指数收集(收集系统性能情况) 下载文件 解压并复制node_exporter应用程序到 ...

  3. UOJ#424. 【集训队作业2018】count 多项式,FFT,矩阵

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ424.html 题解 主席太神仙了! 首先我们把题意转化成:对所有挺好序列建 笛卡尔树,有多少笛卡尔树互不 ...

  4. Linux中jdk的安装配置

    1.下载jdk安装包 2.解压文件:tar -zxvf jdk-8u211-linux-x64.tar.gz 3.编辑环境变量:vi /etc/profile 4.在环境变量文末添加三行: expor ...

  5. Cow Contest POJ - 3660 (floyd 传递闭包)

    N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we ...

  6. 浅谈C#常用集合类的实现以及基本操作复杂度

    List 集合类是顺序线性表,Add操作是O(1)或是O(n)的,由于List的容量是动态扩容的,在未扩容之前,其Add操作是O(1),而在需要扩容的时候,会拷贝已存在的那些元素同时添加新的元素,此时 ...

  7. iperf3 使用

    iperf 分client 和 server server:   iperf3 -s -p 5000 -i 1 client: iperf3 -c 192.168.31.11 -p 5000 Serv ...

  8. 2018-2019-2 网络对抗技术 20162329 Exp5 MSF基础应用

    目录 Exp5 MSF基础应用 一.基础问题回答 二.攻击系统 ms08_067攻击(成功) 三.攻击浏览器 ms11_050_mshtml_cobjectelement(Win7失败) 手机浏览器攻 ...

  9. js与es6中获取时间戳

    在项目中经常会用到求时间戳的问题,下面是已经封装好的函数,直接使用就可以.1.js常用获取时间戳的方法 // 获取时间戳 var start = new Date().getTime(); conso ...

  10. 在 Vim 中优雅地查找和替换(转)

    总有人问我 Vim 中能不能查找,当然能!而且是超级强的查找! 这篇文章来详细介绍 Vim 中查找相关的设置和使用方法. 包括查找与替换.查找光标所在词.高亮前景/背景色.切换高亮状态.大小写敏感查找 ...