『现学现忘』Git分支 — 39、Git中分支与对象的关系
1、Git对象之间的关系
我们之前学了Git的三个对象:提交对象、树对象、数据对象。
我们假设现在有一个工作目录,里面进行了三次提交,包括一次新增文件和两次对文件的修改。
- 每次一把工作区中的文件添加到暂存区时,暂存操作会为每一个文件计算校验和,然后会把当前版本的文件快照(即文件的内容)保存到 Git 仓库中 (Git 使用
blob对象来保存它们),最后将校验和加入到暂存区域等待提交。 - 每一次使用
git commit命令进行提交操作时,Git会先计算每一个子目录的校验和, 然后在 Git 仓库中这些校验和保存为树对象。
随后,Git 便会创建一个提交对象, 它除了包含上面提到的那些信息外,还包含指向这个树对象的指针。 如此一来,Git 就可以在需要的时候重现此次保存的快照。
此时的Git仓库中就会有五个Git对象:三个 blob 对象(保存着文件快照)、一个 树 对象 (记录着目录结构和 blob 对象索引)以及一个 提交 对象(包含着指向前述树对象的指针和所有提交信息)。
这个对象之间的关系,如下图:

总结提交对象、树对象、数据对象之间的关系:
- 一个提交操作生成一个提交对象。
- 一个提交对象包含一个(暂存区)生成
Tree对象。(对Tree对象的封装,单方向一对一) - 一个(暂存区)生成
Tree对象,里面包含子Tree对象和Blob对象。子Tree对象还可以继续包含子Tree对象和Blob对象。
这样子Tree对象对应文件系统中的目录+文件名,Blob对象对应着文件中的内容,这就是Git中数据存储的形式。 - 一个
Blob对象对应着一个文件某一时刻的版本。
三种对象之间的关系如下图:

那么问题来了:每一个Commit对象,是怎样的组合到一起的呢?
2、提交对象与分支的关系
(1)提交对象与分支的关系
Git版本管理系统是以时间线来对版本进行管理的,这条时间线上会有很多的时间节点,这些时间节点就是一个个的Commit对象。
即:Git的每次提交,都会自动把它们串成一条时间线,这条时间线就是一个分支。
如下图所示:每一次提交产生的提交对象,会包含一个指向上次提交对象(父对象)的指针,这样就形成了一条链状结构,就相当于一条线。

(2)分支说明
Git的分支,其实本质上仅仅是指向提交对象的可变指针。
Git仓库初始化之后,会默认创建一个master分支,即主分支。
如果没有新建分支,那么就只有一条时间线,即只有一个分支,master分支(主分支)。
每次提交操作之后,会生成新的提交对象(如上图), master 分支会在每次提交时自动向前移动。(也就是自动指向最新的提交对象)
(3)HEAD与分支的关系
我们在学习Git的时候,常常会看到HEAD这个名称,它指的是什么呢?
Git中维护一个名为HEAD的引用变量,我们将此变量称为指针,它的目的是引用或指向本地版本库中的特定提交。
当我们进行新的提交时,指针将改变或移动,以指向新的提交。
HEAD始终指向Git本地版本库中当前正在工作的分支的尖端(即最新一次提交)。
概括来说:HEAD是对当前分支中,最后一次提交的引用。(可以将HEAD想象为是,当前分支最后一次提交的别名。)
再继续:
HEAD严格来说不是指向提交,而是指向master(分支),master(分支)才是指向具体的提交,所以,HEAD指向的就相当于是当前分支的最新一次提交。
如下图所示:

Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。
(当然HEAD还有一种分离的状态,我们以后单说,关于HEAD就先理解到这里就很详细了)
『现学现忘』Git分支 — 39、Git中分支与对象的关系的更多相关文章
- 『现学现忘』Git分支 — 38、Git分支介绍
目录 1.Git分支简介 2.Git分支与SVN分支的区别 3.工作中为什么要使用分支 4.Git分支管理的好处 1.Git分支简介 几乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着,你可 ...
- 『现学现忘』Git分支 — 40、分支基本操作(一)
目录 1.创建分支 (1)创建分支 (2)图示理解 2.查看分支列表 3.分支切换 4.查看所有分支的最后一个提交 5.删除分支 1.创建分支 (1)创建分支 Git 是怎么创建新分支的呢? 很简单, ...
- 『现学现忘』Git分支 — 41、分支基本操作(二)
目录 6.新建一个分支并且使分支指向指定的提交对象 7.思考: 8.项目分叉历史的形成 9.分支的总结 提示:接上篇 6.新建一个分支并且使分支指向指定的提交对象 使用命令:git branch br ...
- 『现学现忘』Git基础 — 5、Git的协作模式
目录 1.分布式工作流程 2.集中式工作流 3.分支工作流 4.GitFlow 工作流(最流行) 5.Forking 工作流(偶尔使用) 6.总结 1.分布式工作流程 与传统的集中式版本控制系统(CV ...
- 『现学现忘』Git对象 — 16、Tree对象详解
目录 1.Tree对象介绍 2.Tree对象说明 (1)初始化一个新的本地版本库 (2)创建一个树对象(重点) (3)创建第二个文件(重点) (4)将第一个树对象加入暂存区,使其成为新的树对 3.总结 ...
- 『现学现忘』Git基础 — 3、Git介绍
目录 1.Git的历史 2.Git的特点 3.Git在项目协作开发中所解决的问题 1.Git的历史 Git是目前世界上最先进的分布式版本控制系统,开源.免费. Git 是 Linus (林纳斯)为了帮 ...
- 『现学现忘』Git基础 — 6、Git的操作流程
目录 1.Git的基本操作流程 2.工作区.暂存区.版本库的区别 (1)工作区 (2)版本库 (3)暂存区 (4)通过新增文件理解三个区的关系 (5)说明 1.Git的基本操作流程 初始化一个本地版本 ...
- 『现学现忘』Git基础 — 8、Git创建本地版本库
目录 1.Git版本库介绍 2.创建本地版本库 场景一:创建一个空的本地版本库. 场景二:项目中已存在文件时,创建该项目的本地版本库. 场景三:在GitHub网站上创建仓库,克隆到本地. 1.Git版 ...
- 『现学现忘』Git基础 — 12、Git用户签名(补充)
目录 1.修改用户签名 2.取消用户签名 3.用户签名的优先级 4.总结本文用到的Git命令 1.修改用户签名 其实很简单,就是重新执行git config命令,换个用户名和邮箱地址就可以了,新配置的 ...
随机推荐
- 关于微信豆苹果(IOS)用户1比10充值方法
微信iOS端微信7.0.20版本之后就上线了微信豆功能,相比大家对微信豆已经不陌生了. 微信官方现在给出了微信豆的含义,微信豆是用于支付微信内虚拟物品的道具,支持在视频号中购买虚拟礼物.也可以对公 ...
- 如何仿造websocket请求?
之前两次singnalr. websocket实时推送相关: .NET WebSockets 核心原理初体验 SignalR 从开发到生产部署避坑指南 tag: 浏览器--->nginx--&g ...
- 【原创】Asp.NET Core Web API与Vue 3.0搭建前后分离项目
特地记录一下,网上的教程写的稀里糊涂的,整得我都心塞塞的,其实实现的过程蛮简单的 问题是这样的:我将Vue构建生成好的文件,放在后端wwwroot文件里面,并开启静态文件访问功能,结果总是无法显示相应 ...
- React性能优化,六个小技巧教你减少组件无效渲染
壹 ❀ 引 在过去的一段时间,我一直围绕项目中体验不好或者无效渲染较为严重的组件做性能优化,多少积累了一些经验所以想着整理成一片文章,下图就是优化后的一个组件,可以对比优化前一次切换与优化后多次切换的 ...
- 【建议收藏】Mac VMWare NAT模式安装 CentOS 7-操作教程
学习大数据离不开 Linux 系统,网络上大部分文章都是在 Windows 系统下使用 VMWare Workstation 安装 CentOS ,并使用 NAT 模式配置网络.本文基于 Mac OS ...
- JavaSciprt 笔记目录
JavaScript 基础知识(一):对象以及原型 JavaScript 基础知识(二):闭包 JavaScript 异步编程(一):认识异步编程 JavaScript 异步编程(二):Promise
- 【unity游戏入门】2 使用代码编写Hello Unity游戏
作者 罗芭Remoo 2021年9月24日 第一章.许可证的安装 下载好Unity之后,我们还需要一个前置操作才可以进入Unity引擎----许可证. 当然不用担心,Unity是一个开放的引擎,一切以 ...
- pod资源的健康检查-liveness探针的exec使用
使用探针的方式对pod资源健康检查 探针的种类 livenessProbe:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器 readinessProbe:可用性检查,周期性检查服务是否 ...
- Java开发学习(三十)----Maven聚合和继承解析
一.聚合 分模块开发后,需要将这四个项目都安装到本地仓库,目前我们只能通过项目Maven面板的install来安装,并且需要安装四个,如果我们的项目足够多,那么一个个安装起来还是比较麻烦的 如果四个项 ...
- Java代码审计之不安全的Java代码
Java代码审计之不安全的Java代码 在打靶场的同时,需要想一下如果你是开发人员你会怎样去防御这种漏洞,而作为攻击方你又怎么去绕过开发人员的防御. 环境搭建 https://github.com ...