提示:前面三篇文章已经分别的对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. JVM内存模型——堆(heap)、栈(stack)和方法区(method)

      JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:堆内存用于存放由new创建的对象和数组.堆是JVM管理的内存中最大的一块,堆被所有线程共享,目的 ...

  2. Java有没有goto?

    goto是Java中的保留字,暂时还不是Java的关键字.

  3. Mock 或 Stub 有什么区别?

    存根 一个有助于运行测试的虚拟对象. 在某些可以硬编码的条件下提供固定行为. 永远不会测试存根的任何其他行为. 例如,对于空堆栈,您可以创建一个只为 empty()方法返回 true 的存根.因此, ...

  4. Elasticsearch 在部署时,对 Linux 的设置有哪些优化方 法?

    1.64 GB 内存的机器是非常理想的, 但是 32 GB 和 16 GB 机器也是很常见的. 少于 8 GB 会适得其反. 2.如果你要在更快的 CPUs 和更多的核心之间选择,选择更多的核心更好. ...

  5. maven项目改造成springboot项目

    springboot项目其实归根到底就是一个maven项目,通常我们创建springboot项目,只要使用idea中的spring Initializr就可以创建就可以了. 今天我们来讲下如何改造一个 ...

  6. 攻防世界 Ditf misc

    Ditf 附件下载下来就是一张图片,我们拉到hxd中发现应该有隐藏的压缩包 我们拉入到kali里面分析 意外发现图片高度被修改过我们先用binwalk分析图片看看 我们先尝试分离一下分离出一个压缩包但 ...

  7. Azure DevOps 中 Dapr项目自动部署流程实践

    注:本文中主要讨论 .NET6.0项目在 k8s 中运行的 Dapr 的持续集成流程, 但实际上不是Dapr的项目部署到K8s也是相同流程,只是k8s的yaml配置文件有所不同 流程选择 基于 Dap ...

  8. 从CSS盒子模型说起

    前言 总括: 对于盒子模型,BFC,IFC和外边距合并等概念和问题的总结 原文地址:从CSS盒子模型说起 知乎专栏:前端进击者 博主博客地址:Damonare的个人博客 为学之道,莫先于穷理:穷理之要 ...

  9. EDM响应式邮件框架:MJML

    概述 新课题研究:响应式邮件框架MJML(MJML官网:https://mjml.io/)姐妹篇: EDM响应式邮件框架:Formerly Ink 介绍 MJML是一种标记语言,设计用于轻松实现一个响 ...

  10. SQL之创建表

    1.创建表------ (方法一)-------create table Persons(id NUMBER,                                       age NU ...