提示:前面三篇文章已经分别的对blob对象、tree对象、commit对象进行了详细的说明,这篇文章我们总结一下,Git对象在基础操作流程中的生成的时机。

1、Git操作最基本的流程

1)创建工作目录对工作目录进行修改

2)执行git add ./命令添加文件到暂存区。

相当于执行了如下两个底层命令:

  • git hash-object -w文件名(修改了多少个工作目录中的文件此命令就要被执行多少次)
  • git update-index

说明:git add命令做了什么事情?

表面上是将工作目录中的文件添加到暂存区中,其实真正的流程是:

  • 先将工作目录中的文件,生成blob对象存储到本地版本库中,

    一个文件生成一个blob对象,一个文件执行一次git hash-object -w 文件路径命令。
  • 再通过git update-index命令,把本地版本库中blob对象,生成文件的索引(快照),存储到暂存区中。

所以说Git是绝对安全的,只要你对文件做过的修改,哪怕没有提交到本地版本库,只是提交到暂存区,Git也会帮你记录下来。

3)执行git commit -m "注释内容"命令,把暂存区的快照提交到本地版本库。

相当于执行了如下两个底层命令:

  • git write-tree:生成tree对象。
  • git commit-tree:生成commit对象。

说明:git commit命令做了什么事情?

表面上是将暂存区的文件索引提交到了本地版本库中,其实真正的流程是:

  • 先通过git write-tree命令,把暂存区中的索引信息,生成一个tree对象存储到本地版本库中。
  • 然后通过git commit-tree命令,把上面生成的树对象进行封存,生成一个commit对象,存储到本地版本库中。

重点提示:一个commit对象肯定会对应一个tree对象(单方向1对1的关系),一个commit对象是不会对应两个tree对象的。(如上说明)

2、工作目录中文件的状态

工作目录下面的所有文件都不外乎这两种状态:已跟踪状态或未跟踪状态。

已跟踪的文件是指本来就被纳入版本控制管理的文件,在之前的快照中有它们的记录,工作一段时间后,它们的状态会分为已提交状态,已修改状态或者已暂存状态,这三种。

然后所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。

使用Git时的文件状态变化周期如下图所示:

提示:初次克隆某个仓库到本地时,工作目录中的所有文件都属于已跟踪文件,且状态为已提交;在编辑过某些文件之后,Git将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件。

3、Git效率说明

我们经历了一次完整的Git提交过程,现在我们来思考一下Git提供的这三种对象带来的高效率:

  • 首先Git会对所有的文件内容进行压缩,这使得即使仓库中存储了非常多的内容,而.git也不会很大,
  • 然后就是速度,考虑这样的情况,当我们修改了一个文件的时候,Git会去计算这个文件的SHA-1散列值。

    如果该散列值所得到的路径已经存在,那就说明,这个文件并没有被真正修改(也可以是改了然后又改了回来),这时就不会在本地版本库中存储新的对象。也就是说blob对象跟文件名一点关系都没有,两个不同名字的文件,只要他们的内容相同,在Git的眼里他就是一个blob对象,且只有一份。

    如果我们真正的修改了一个文件,那么Git会计算这个文件的散列值,然后将这个文件压缩存储在objects目录中。

    这样设计的可以大大的节约存储的空间,也提升了Git的存储速度。
  • 如果我们需要进行一次提交操作,是先对原来的文件进行更改,然后需要创建一个相应的树结构,来记录这些文件的变化。也就是每一次提交都创建一个顶层树对象来表示这次提交快照。

    Git会对比前一个提交的顶层树对象,然后将没有改变的树对象或数据对象直接复制到新创建的这个顶层树对象中,将改变的树对象或数据对象,进行覆盖,最后再提交到本地版本库。

所以说决定你仓库大小的并不是完全在于每个文件的大小,而是你修改提交的次数,修改的次数越多,产生的树对象、数据对象和提交对象也就越多。

参考:https://blog.csdn.net/songyunzu/article/details/92023816

『现学现忘』Git基础 — 18、Git对象的总结的更多相关文章

  1. 『现学现忘』Git基础 — 13、Git的基础操作

    目录 1.Git最基础的使用方式 (1)初始化本地版本库 (2)查看文件的状态 (3)把文件添加到暂存区 (4)把暂存区的内容提交到本地版本库 2.总结本文用到的Git命令 1.Git最基础的使用方式 ...

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

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

  3. 『现学现忘』Git基础 — 4、Git下载与安装

    目录 1.Git下载 2.Git在Windows下的详细安装 3.验证Git是否安装成功 1.Git下载 进入官方地址下载Git客户端:https://git-scm.com/download/win ...

  4. 『现学现忘』Git基础 — 7、设置Git Bash终端默认路径

    目录 1.Git Bash默认路径 2.如何查看Git Bash终端默认路径 3.如何修改Git Bash终端的默认路径 4.拓展:指定目录进入Git Bash终端 5.注意事项 如果您不熟悉Git命 ...

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

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

  6. 『现学现忘』Git基础 — 14、Git基础操作的总结与补充

    目录 1.Git本地版本库结构 2.Git常用操作方法 3.补充:添加多个文件到暂存区 4.补充:提交操作未写备注 5.补充:从工作区直接提交到版本库 1.Git本地版本库结构 如下图所示: 工作区( ...

  7. 『现学现忘』Git基础 — 19、在Git中进行忽略文件操作

    目录 1.忽略文件说明 2.忽略文件的原则 3..gitignore忽略规则 4.忽略文件的三种方式 (1)忽略单个仓库中的文件(远程共用) (2)忽略单个仓库中的文件(本地使用) (3)全局忽略 1 ...

  8. 『现学现忘』Git基础 — 23、Git中的撤销操作

    目录 1.撤销操作说明 2.撤销工作区中文件的修改 3.撤销暂存区中文件的修改 4.总结 1.撤销操作说明 我们在使用Git版本管理时,往往需要撤销某些操作.比如说我们想将某个修改后的文件撤销到上一个 ...

  9. 『现学现忘』Git基础 — 24、Git中查看历史版本记录

    目录 1.查看详细的历史版本记录 2.简化显示历史版本记录 3.历史版本记录常用操作 (1)指定查看最近几次提交的内容 (2)以简单图形的方式查看分支版本历史 (3)翻页与退出 4.查看分支相关的版本 ...

  10. 『现学现忘』Git基础 — 26、给Git命令设置别名

    目录 1.什么是Git命令的别名 2.别名的全局配置 3.别名的局部配置 4.删除所有别名 5.小练习 1.什么是Git命令的别名 Git中命令很多,有些命令比较长,有些命令也不好记,也容易写错. 例 ...

随机推荐

  1. 你是怎么看Spring框架的?

    Spring是一个轻量级的容器,非侵入性的框架.最重要的核心概念是IOC,并提供AOP概念的实现方式,提供对持久层,事务的支持,对当前流行的一些框架(Struts,Hibernate,MVC),Spi ...

  2. Kafka 分区的目的?

    分区对于 Kafka 集群的好处是:实现负载均衡.分区对于消费者来说,可以提高并发度,提高效率.

  3. 解释 Spring 框架中 bean 的生命周期?

    Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean. Spring 根据 bean 的定义填充所有的属性. 如果 bean 实现了 BeanNameAware 接口,Sp ...

  4. 详细描述一下 Elasticsearch 索引文档的过程 ?

    这里的索引文档应该理解为文档写入 ES,创建索引的过程. 文档写入包含:单文档写入和批量 bulk 写入,这里只解释一下:单文档写入流程. 记住官方文档中的这个图. 第一步:客户写集群某节点写入数据, ...

  5. java的泛型hei

    泛型是一种未知的数据类型,当我们不知道使用什么数据类型的时候就可以使用泛型 泛型也可以看出是一个变量,用来接受数据类型 E e :Element 元素 T t: Type 类型 /* Collecti ...

  6. kafka producer的batch.size和linger.ms

    1.问题 batch.size和linger.ms是对kafka producer性能影响比较大的两个参数.batch.size是producer批量发送的基本单位,默认是16384Bytes,即16 ...

  7. C语言之数据类型(知识点8)

    一.数据类型 1.数据基本类型 (1)整数 ①有符号整形 有符号短整型 short 有符号基本整形  int 有符号长整形  long ②无符号整形 无符号基本整形 无符号短整型 无符号长整型 (2) ...

  8. C语言之基本语句分类(知识点5)

    一.C语言基本语句分类 ①数据定义语句 ②赋值语句 ③函数调用语句 ④表达式语句 ⑤流程控制语句 ⑥复合语句(多个大括号的层次) ⑦空语句 二.注意 ①scanf("%d,%d", ...

  9. C 语言中 include <> 与include "" 的区别?

    #include < > 引用的是编译器的类库路径里面的头文件. #include " " 引用的是你程序目录的相对路径中的头文件,如果在程序目录没有找到引用的头文件则 ...

  10. 5V转10.5V原理图