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)

大家都在看

  • MySQL — 数据查询语言

    DQL 全称 Data Query Language。数据查询语言,用来查询数据库中表的记录。 语法: select 查询列表(字段、常量、函数、表达式) from 表名; 字段别…

    Linux 2023年6月8日
    094
  • IDM 下载器的安装和使用

    下载安装 为大家提供免注册版本:IDM下载器 – Dominic 的蓝奏云分享 下载解压之后,双击第一个文件进行安装 之后一路选择”Next”即…

    Linux 2023年6月8日
    0149
  • 在使用amoeba连接数据库时,报错java.lang.Exception: poolName=slaves, no valid pools

    搭建3台MySQL服务器,完成主从复制,搭建一台amoeba服务器,完成MySQL的读写分离 问题描述: 问题1、 在服务搭建完毕后,利用客户机连接amoeba服务器登录数据库,无…

    Linux 2023年6月13日
    086
  • JavaScript快速入门-07-异常处理与调试

    7、异常处理与调试 7.1 异常处理 7.1.1 try/catch语句 try/catch语句常用于处理JavaScript中的异常,其基本语法如下所示: try { // 可能…

    Linux 2023年6月7日
    0113
  • 函数式编程

    1 概述 2 Lambda表达式 3 Stream流 // 创建stream的方法 //1 使用Collection下的 stream() 和 parallelStream() 方…

    Linux 2023年6月7日
    094
  • 百钱买百鸡问题

    百钱买百鸡问题 题目:公元前5世纪末,中国古代数学家张丘建在他的《算经》中提出了著名的 “百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,…

    Linux 2023年6月7日
    0107
  • macbook air 2019 安装win10单系统

    目前不考虑写的太详细了,如果有同学遇到问题了我再完善,主要是把遇到的坑讲下第一步,准备2个U盘(如果不嫌麻烦一个也可以)1.用大白菜或者老毛桃将其中一个做成启动盘2.在window…

    Linux 2023年6月14日
    0131
  • SharePoint 2010开发工具图解系列:PowerShell脚本

    练习 :使用PowerShell脚本 在此次练习中,您将了解到如何使用PowerShell和专为SharePoint 2010构建的PowerShell加载项。 从Windows …

    Linux 2023年5月28日
    0100
  • Java基础系列–01_基础类型

    J2SE、J2ME、J2EE分别指什么?J2SE 基础版,桌面应用。J2ME 微型版,手机开发。(android,ios)J2EE 企业版,所有浏览器访问的应用程序。注意:JDK5…

    Linux 2023年6月7日
    0102
  • 小文件、nginx、Redis、Moosefs

    现在有3KW的数据,单条数据都很小的,如果按key-value来看的话,key就是32位的MD5字符串,value按平均算大概是100字节左右。 现在需要将这些数据做缓存以在高并非…

    Linux 2023年5月28日
    0116
  • [云原生]Kubernetes-集群搭建(第2章)

    一、前置知识点 二、kubeadm部署方式介绍 三、安装要求 四、最终目标 五、准备环境 六、环境初始化 6.1 设置系统主机名以及Hosts文件的相互解析 6.2 安装依赖文件(…

    Linux 2023年6月13日
    078
  • Flink 如何分流数据

    场景 分流方式 如何分流 使用Filter分流 使用Split分流 使用Side Output分流 场景 获取流数据的时候,通常需要根据所需把流拆分出其他多个流,根据不同的流再去作…

    Linux 2023年6月7日
    0138
  • LinuxKernel(一)

    首先,回顾一下基础的宏操作: C语言宏 # 与 ## #的作用是字符串化:在一个宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define ERROR_LOG…

    Linux 2023年6月8日
    0116
  • 利用numpy实现list降维

    python读取数据库得到的事一个类似二维数组的list,有时候需要降维操作,numpy提供一个很有用的函数,可以直接使用 import numpy as np a = np.ar…

    Linux 2023年6月14日
    0122
  • 节约内存:Instagram的Redis实践(转)

    1.M emcached 内存Key-Value Cache Redis 内存数据库 四,节约内存:Instagram的Redis实践 Instagram可以说是网拍App的始祖级…

    Linux 2023年5月28日
    0100
  • 深入理解linux内核-进程和程序

    task_struct //进程基本信息 pid 进程id号 tgid 线程组id号,与线程组领头线程pid号相同 getpid()返回该值 tasks init_struct链接…

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