Git简介

Git简介

Git是一个开源的分布式版本控制系统,是目前主流的版本控制系统,很多软件项目都会用它做源代码管理。Git的常用操作想必很多人都会,但是可能了解Git内部原理的人并不多。了解一些底层的东西,可以更好的帮你理清思路,遇到问题的时候也可以更好的去解决。

准备工作

在介绍Git如何存储数据之前,我们先做一些准备工作。
首先新建一个目录git-test,然后在这个目录右键,打开Git Bash,

Git简介

然后,在Git Bash,分别执行以下命令,

$ git init
$ echo 'a' > a.txt
$ echo 'b' > b.txt
$ git add .

至此,准备工作完成。我们可以看到,git-test目录下现在有一个.git目录,以及两个txt文件(a.txt、b.txt)。

Git简介

Git如何存储数据

.git目录是 git init后在当前目录生成的一个管理git仓库的目录,这里包含所有git操作所需要的东西。其中objects目录下存放所有的git对象。经过上面的操作后,objects目录是这样的,

Git简介

其中info和pack目录是执行git init以后就已经有的,而78和61目录分别对应着a.txt和b.txt文件,这两个目录是创建了a.txt和b.txt,并执行 git add .命令后才生成的。

78目录下有一个文件,查看一下这个文件的内容,执行以下命令,

$ cat .git/objects/78/981922613b2afb6025042ff6bd878ac1994e85

Git简介

我们看到文件的内容是一串乱码,这是因为Git将信息压缩成二进制。Git提供了一个能够帮助探索objects的命令: git cat-file [-t] [-p], -t可以查看object的类型,-p可以查看object存储的具体内容。分别执行以下命令,

$ git cat-file -t 7898
$ git cat-file -p 7898

Git简介

blob类型的object

7898就是目录名加上文件名的前两位。可以看到,这个object是一个blob类型的object,而这个object存储的内容,就是我们写入到a.txt的文本。因此,上面的乱码其实就是a.txt的内容,也就是说,这个object存储着a.txt文件的内容。

blob类型的object存储的是一个文件的内容。然后,Git根据这个文件的内容经过SHA1哈希算法得到对应的哈希值(981922613b2afb6025042ff6bd878ac1994e85),作为这个object在Git仓库中的唯一id。现在的Git仓库是这样子的,如图:

Git简介

tree类型的object

接着执行下一个命令,

$ git commit -m '第一次提交'

执行 git commit命令后,objects目录下又多出了两个object,如图:

Git简介

首先,用 git cat-file -t命令查看f4目录下object的类型,如图:

Git简介

可以看到,这个object的类型是tree,利用 git cat-file -p命令查看这个object的内容,如图:

Git简介

可以看到,tree类型的object存储了一个目录结构的快照,从左到右分别显示了每个文件的权限、类型、object的id(SHA1值)、以及文件名。现在的Git仓库是这样子的,如图:

Git简介

commit类型的object

用同样的方法,查看3c目录下的文件,如图:

Git简介

这是一个commit类型的object,而这个object存储了一个tree类型的object的id,以及提交的一些信息。现在的Git仓库是这样子的,如图:

Git简介

分支

实际做项目都会有很多分支,Git的分支信息就存储在/.git/refs/heads目录下,如图:

Git简介

因为现在只有一个master分支,所以只有一个master文件。直接打开master这个文件,可以看到这个文件存储了 3c0acd6df4df30074678a2b97967a82efd9c8acf这样一串字符串,这正是上面的commit类型object的id。现在的Git仓库是这样子的,如图:

Git简介

HEAD

在/.git/HEAD这个文件下,记录内容如下:

ref: refs/heads/master

这个内容告诉Git当前修改的内容是基于哪个分支上的,我们可以理解为这是一个指针。现在的Git仓库是这样子的,如图:

Git简介

至此,一个完整的Git存储结构就出来了。

Git的三个分区

Git有3个分区,分别是工作区、暂存区和版本库。

工作区: 就是项目所在目录(除去.git目录),所有代码编辑都在这上面完成。

暂存区: 英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

Git仓库: 由Git object记录着每一次提交的快照,以及链式结构记录的提交变更历史。

有了3个分区,整个结构如下图:

Git简介

Git的内部运作

现在,我们尝试修改a.txt文件,如图:

Git简介

这时候,除了工作目录下的a.txt文件内容有变化,暂存区和Git仓库都是没有变化的。接着,执行 git add a.txt命令,这时/.git/objects目录下又多了一个对象,如图:

Git简介

这个新增的object也是blob类型,对应着新修改的a.txt文件。这时,整个结构如下图:

Git简介

最后,我们执行 git commit -m '修改a.txt'命令,不出意外,/.git/objects目录会生成两个object,根据上面的介绍,这两个object分别是tree和commit类型,如图:

Git简介

这时,整个结构如下图:

Git简介

从上图可以看到,master分支已经指向新的commit object,并且新的commit object记录着它的parent object,也就是旧的那个commit object,这使得我们可以查看Git的提交历史。

Original: https://www.cnblogs.com/ayic/p/16678252.html
Author: Yi00
Title: Git简介

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/577964/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • urandom和random区别

    linux中提供了 /dev/urandom 和 /dev/random 两个特殊设备来提供随机数。那么这两个文件有什么区别呢?要回答这个问题,先需要了解熵这个概念。 熵linux…

    Linux 2023年6月7日
    076
  • zabbix部署

    zabbix zabbix zabbix介绍 zabbix特点 zabbix部署 zabbix介绍 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开…

    Linux 2023年6月13日
    0119
  • Linux下IPC之共享内存的使用方法

    基本参考 《Unix环境高级编程》 第14.9节共享内存来学习。 需要说明的 讲shmget(key,size, flag)函数时,书上大概意识是说, 想访问已有的shm时,key…

    Linux 2023年6月7日
    075
  • 文件批量改名(有规律)

    1.如你的文件放在桌面名字为file的文件内,我要把这些文件批量名称改为page1.jpg,page2.jpg,page3.jpg………. 2….

    Linux 2023年6月13日
    076
  • AI场景存储优化:云知声超算平台基于 JuiceFS 的存储实践

    云知声是一家专注于语音及语言处理的技术公司。 Atlas 超级计算平台是云知声的计算底层基础架构,为云知声在 AI 各个领域(如语音、自然语言处理、视觉等)的模型迭代提供训练加速等…

    Linux 2023年6月14日
    085
  • 汉诺塔

    设计并实现一个游戏:汉诺塔。完成这个实验,涉及C++面向对象编程以及基本的数据结构知识(如栈和队列)但具此次实现并没有使用STL库。 1. 汉诺塔问题 汉诺塔是一个著名的数学问题。…

    Linux 2023年6月13日
    080
  • n的阶乘前100项。Table of n! for n = 1..100

    n的阶乘前100项 {1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600,6227020800,871782…

    Linux 2023年6月6日
    072
  • spring redis session 使用入门[原]

    两份properties配置, 仅端口不同 配置文件添加redis 链接 application-9001.properties application-9002.properti…

    Linux 2023年5月28日
    087
  • mysql-高可用架构:MHA

    mysql-高可用架构:MHA 1. MHA简介 MHA(Master High Availability)是由日本人yoshinorim开发的一款成熟且开源的MySQL高可用程序…

    Linux 2023年6月13日
    069
  • JAVA设计模式-原型模式

    JAVA设计模式-原型模式 介绍 原型模式是一种创建型模式,用于创建重复的对象,并且保证性能。原型模式创建的对象是由原型对象自身创建的,是原型对象的一个克隆,和原型对象具有相同的结…

    Linux 2023年6月6日
    087
  • 学习一下 JVM (一) — 了解一下 JVM 基本概念

    一、JVM 基本认识 1、虚拟机 与 JVM (1)虚拟机(Virtual Machine),可以理解为一台虚拟的计算机,其是一款软件,用来执行一系列虚拟的计算机指令。可以分为:系…

    Linux 2023年6月11日
    094
  • Log4j 2 日志框架

    Apache Log4j 2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了显着改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构…

    Linux 2023年6月8日
    080
  • 2021 — 冰与火之歌

    大半夜的睡不着,越发的想给 2021 年作个总结,一想更睡不着了,来唠叨下吧。 一拖再拖的婚礼。本来定在今年正月的婚礼,因为疫情,不敢办,村里也不让办;然后选在国庆吧,卧槽,封城了…

    Linux 2023年6月16日
    0112
  • CANoe的安装和使用

    CANoe的简介 CANoe是德国Vector公司为汽车总线的开发而设计的一款总线开发环境,全称叫CAN open environment。CANoe集合了网络监控、数据获取/记录…

    Linux 2023年6月13日
    0194
  • 如何写出健壮可靠的shell脚本

    1 脚本失败时即退出 ; set -e 例子: 可以在脚本的开头设置如下set -e 2 打印脚本执行过程 sh -x test.sh #整个过程执行了哪些命令或者在开头加上set…

    Linux 2023年5月28日
    079
  • Python环境安装

    一、下载地址: Python:Download Python | Python.org PyCharm:Download PyCharm: Python IDE for Profe…

    Linux 2023年6月13日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球