1、Git对象之间的关系

我们之前学了Git的三个对象:提交对象树对象数据对象

我们假设现在有一个工作目录,里面进行了三次提交,包括一次新增文件和两次对文件的修改。

  • 每次一把工作区中的文件添加到暂存区时,暂存操作会为每一个文件计算校验和,然后会把当前版本的文件快照(即文件的内容)保存到 Git 仓库中 (Git 使用 blob 对象来保存它们),最后将校验和加入到暂存区域等待提交。
  • 每一次使用 git commit 命令进行提交操作时,Git会先计算每一个子目录的校验和, 然后在 Git 仓库中这些校验和保存为树对象

    随后,Git 便会创建一个提交对象, 它除了包含上面提到的那些信息外,还包含指向这个树对象的指针。 如此一来,Git 就可以在需要的时候重现此次保存的快照。

此时的Git仓库中就会有五个Git对象:三个 blob 对象(保存着文件快照)、一个 对象 (记录着目录结构和 blob 对象索引)以及一个 提交 对象(包含着指向前述树对象的指针和所有提交信息)。

这个对象之间的关系,如下图:

总结提交对象树对象数据对象之间的关系:

  1. 一个提交操作生成一个提交对象。
  2. 一个提交对象包含一个(暂存区)生成Tree对象。(对Tree对象的封装,单方向一对一)
  3. 一个(暂存区)生成Tree对象,里面包含子Tree对象和Blob对象。子Tree对象还可以继续包含子Tree对象和Blob对象。

    这样子Tree对象对应文件系统中的目录+文件名Blob对象对应着文件中的内容,这就是Git中数据存储的形式。
  4. 一个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中分支与对象的关系的更多相关文章

  1. 『现学现忘』Git分支 — 38、Git分支介绍

    目录 1.Git分支简介 2.Git分支与SVN分支的区别 3.工作中为什么要使用分支 4.Git分支管理的好处 1.Git分支简介 几乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着,你可 ...

  2. 『现学现忘』Git分支 — 40、分支基本操作(一)

    目录 1.创建分支 (1)创建分支 (2)图示理解 2.查看分支列表 3.分支切换 4.查看所有分支的最后一个提交 5.删除分支 1.创建分支 (1)创建分支 Git 是怎么创建新分支的呢? 很简单, ...

  3. 『现学现忘』Git分支 — 41、分支基本操作(二)

    目录 6.新建一个分支并且使分支指向指定的提交对象 7.思考: 8.项目分叉历史的形成 9.分支的总结 提示:接上篇 6.新建一个分支并且使分支指向指定的提交对象 使用命令:git branch br ...

  4. 『现学现忘』Git基础 — 5、Git的协作模式

    目录 1.分布式工作流程 2.集中式工作流 3.分支工作流 4.GitFlow 工作流(最流行) 5.Forking 工作流(偶尔使用) 6.总结 1.分布式工作流程 与传统的集中式版本控制系统(CV ...

  5. 『现学现忘』Git对象 — 16、Tree对象详解

    目录 1.Tree对象介绍 2.Tree对象说明 (1)初始化一个新的本地版本库 (2)创建一个树对象(重点) (3)创建第二个文件(重点) (4)将第一个树对象加入暂存区,使其成为新的树对 3.总结 ...

  6. 『现学现忘』Git基础 — 3、Git介绍

    目录 1.Git的历史 2.Git的特点 3.Git在项目协作开发中所解决的问题 1.Git的历史 Git是目前世界上最先进的分布式版本控制系统,开源.免费. Git 是 Linus (林纳斯)为了帮 ...

  7. 『现学现忘』Git基础 — 6、Git的操作流程

    目录 1.Git的基本操作流程 2.工作区.暂存区.版本库的区别 (1)工作区 (2)版本库 (3)暂存区 (4)通过新增文件理解三个区的关系 (5)说明 1.Git的基本操作流程 初始化一个本地版本 ...

  8. 『现学现忘』Git基础 — 8、Git创建本地版本库

    目录 1.Git版本库介绍 2.创建本地版本库 场景一:创建一个空的本地版本库. 场景二:项目中已存在文件时,创建该项目的本地版本库. 场景三:在GitHub网站上创建仓库,克隆到本地. 1.Git版 ...

  9. 『现学现忘』Git基础 — 12、Git用户签名(补充)

    目录 1.修改用户签名 2.取消用户签名 3.用户签名的优先级 4.总结本文用到的Git命令 1.修改用户签名 其实很简单,就是重新执行git config命令,换个用户名和邮箱地址就可以了,新配置的 ...

随机推荐

  1. 【安全通告】关于 DolphinScheduler 漏洞情况的说明

    点击上方 蓝字关注我们 [安全通报] [影响程度:低] Apache DolphinScheduler 社区邮件列表最近通告了 1 个漏洞,考虑到有很多用户并未订阅此邮件列表,我们特地在此进行情况说明 ...

  2. .NET 扩展 官方 Logger 实现将日志保存到本地文件

    .NET 项目默认情况下 日志是使用的 ILogger 接口,默认提供一下四种日志记录程序: 控制台 调试 EventSource EventLog 这四种记录程序都是默认包含在 .NET 运行时库中 ...

  3. Rust 从入门到精通05-数据类型

    Rust 是 静态类型(statically typed)语言,也就是说在编译时就必须知道所有变量的类型. 在 Rust 中,每一个值都属于某一个 数据类型(data type),分为两大类: ①.标 ...

  4. Vue+Koa+MongoDB从零打造一个任务管理系统

    大概是在18年的时候,当时还没有疫情.当时工作中同时负责多个项目,有 PC 端运营管理后台的,有移动端 M 站的,有微信小程序的,每天 git 分支切到头昏眼花,每个需求提测需要发送邮件,而且周五要写 ...

  5. 054_末晨曦Vue技术_处理边界情况之组件之间的循环引用

    组件之间的循环引用 点击打开视频讲解更详细 假设你需要构建一个文件目录树,像访达或资源管理器那样的.你可能有一个 <tree-folder> 组件,模板是这样的: <p> &l ...

  6. cad开发动态块对应的界面

    为了使设计人员更加容易的操作动态块, 应经可能对动态块的制作制定相关的规范, 如动态块的属性 => 类的属性 动态块操作名称(作为变量名,后台数据库的字段) 动态块操作描述  (作为注释,后台数 ...

  7. Spring 08: AOP面向切面编程 + 手写AOP框架

    核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...

  8. 【lwip】04-网络数据包流向

    目录 前言 4.1 TCPIP分层与lwip数据共享 4.2 协议栈线程模型 4.3 pbuf 结构体 4.3.1 pbuf的标志位flags 4.4 pbuf的类型 4.4.1 PBUF_RAM类型 ...

  9. WebGPU实现Ray Packet

    大家好~本文在如何用WebGPU流畅渲染百万级2D物体?基础上进行优化,使用WebGPU实现了Ray Packet,也就是将8*8=64条射线作为一个Packet一起去访问BVH的节点.这样做的好处是 ...

  10. 踩坑 Windows 服务来宿主 .NET 程序

    本文所指的 .NET 程序为 .NET6 的程序.因为 .NET 的版本更新很快,所以方式.方法也有变化,所以网上搜到的方法有些也过时了.以下是最近我实践下来的一点心得(坑). 上一篇说到 不安装运行 ...