提示:前面三篇文章已经分别的对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. 使用Redis实现关注好友的功能

    现在很多社交都有关注或者添加粉丝的功能, 类似于这样的功能我们如果采用数据库做的话只是单纯得到用户的一些粉丝或者关注列表的话是很简单也很容易实现, 但是如果我想要查出两个甚至多个用户共同关注了哪些人或 ...

  2. Mysql之B+树索引实战

    索引代价 空间上的代价 一个索引都对应一棵B+树,树中每一个节点都是一个数据页,一个页默认会占用16KB的存储空间,所以一个索引也是会占用磁盘空间的. 时间上的代价 索引是对数据的排序,那么当对表中的 ...

  3. vue的seo问题?

    seo关系到网站排名, vue搭建spa做前后端分离不好做seo, 可通过其他方法解决: SSR服务端渲染: 将同一个组件渲染为服务器端的 HTML 字符串.利于seo且更快. vue-meta-in ...

  4. Container 在微服务中的用途是什么?

    容器是管理基于微服务的应用程序以便单独开发和部署它们的好方法.您可以将 微服务封装在容器映像及其依赖项中,然后可以使用它来滚动按需实例的微服务, 而无需任何额外的工作.

  5. JPA、JTA、XA相关索引

    JPA和分布式事务简介:https://www.cnblogs.com/onlywujun/p/4784233.html JPA.JTA与JMS区别:https://www.cnblogs.com/y ...

  6. Microservices

    Microservices What are Microservices? What are Microservices - microservices.io Microservices - mart ...

  7. DOS、DOS攻击、DDOS攻击、DRDOS攻击

    https://baike.baidu.com/item/dos%E6%94%BB%E5%87%BB/3792374?fr=aladdin DOS:中文名称是拒绝服务,一切能引起DOS行为的攻击都被称 ...

  8. 前端每日实战:134# 视频演示如何用 CSS 和 GSAP 创作一个树枝发芽的 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/LJmpXZ 可交互视频 此视频是可 ...

  9. vue常用知识点总结

    感谢本文引用链接的各位大佬们,小菜鸟我只是个搬运工 1.谈一谈你理解的vue是什么样子的? vue是数据.视图分离的一个框架,让数据与视图间不会发生直接联系.MVVM 组件化:把整体拆分为各个可以复用 ...

  10. CCF201604-2俄罗斯方块

    问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏. 游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块.每一轮,都会有一个新的由4个小方 ...