「Git」原理

641 阅读3分钟

前言

学习Git原理,从 存储位置三个区域四个对象存储流程 来浅析Git原理
为什么要浅析呢,这样能更好认知整个Git命名操作干了"肾"么。来对应真实的实际案例

存储位置

简介

首先看咱创建Git的文件中有啥子

注释:在终端中输入 ls -a 显示目录隐藏文件(.git文件夹默认隐藏)

简单介绍一下Git常见的文件夹的作用

  • {COMMIT-EDITMSG} 存储最后一次提交的message
  • {description} 用于GitWeb程序
  • {config} 配置特定于该仓库的设置
  • {hooks} 放置客户端或服务端的hook脚本
  • {HEAD} 指明当前处于哪个分支
  • {objects} Git对象存储目录
  • {logs} 用来记录操作信息
  • {refs} Git引用存储目录
  • {branches} 放置分支引用的目录
  • {index} 保存了暂存区域信息

详情

这里边的文件夹作用通过对应的文件名就基本知道里边是干嘛子的了
咱的重点是 objects 这个文件夹中

可以看到进入 objects 文件夹中全都是两个字符开头的文件夹
这一些就是Git通过sha-1将文件中的内容生成一个 40 位长度的hash值
取头 2 位值作为目录名,38 位值作为文件名(文件内容转换为二进制内容)
而我们项目的数据存储位置也就是在这个 objects 宝藏文件夹中啦

info 文件夹下记录对象存储的附加信息
pack 文件夹将修改过的文件打包至一个叫 xxx.pack 的二进制文件来以节省空间并提高效率。

三个区域

简介

Git 中有三个重要的区域:工作区域,暂存区(索引区域),本地仓库

详情

  • 工作区域:操作项目的文件,代码开发和工作都是在这。
  • 暂存区域: 进行 add 操作后添加到的区域,可以理解为一个暂存区域,这里面的代码会在下一次 commit 被提交到本地数据库。
  • 本地仓库:commit 后由 Git object 记录着每一次提交的Blob,准备 push 到远程仓库

总结

再简单梳理下流程为:
工作区域 -> (add)暂存区域 -> (commit)本地仓库 -> (push)远程仓库

四种对象

简介

在Git中 有四种对象 ,blobtreecommittag

详情

  • blob:来存储文件数据的内容,通常是一个二进制文件。
  • tree:相当于一个目录,目录下还会有子目录,管理一些“tree”或“blob”,但最终的节点是blob
  • commit:指向一次提交,也就是只指向一个 tree 对象。还有些时间戳、最近一次提交的作者、指前上次提交(commits)的指针方法。
  • tag: 来标记某一个提交(commit) 的方法。

存储流程

创建/修改文件

创建和修改文件均在工作区中进行,不会影响到暂存区域和本地仓库

add 操作

运行 git add a.file 将发生:

  1. a.file添加到索引区域。
  2. 根据文件内容利用 sha-1 算法计算生成一个 40 位长度的hash值。
  3. 在本地仓库的 objects 目录下创建一个 blob (hash值前两位创建文件夹,剩下38位作为文件名)。
  4. 更新索引将 a.file 指向了新建的blob。

commit操作

运行 git commit -m '' 将发生:

  1. 根据当前的索引生产一个 tree 对象。
  2. 创建一个新的 commit 对象,指向新建的 tree 对象并将上次提交指针指向上一个 commit 形成 log 链
  3. 将当前分支的指针移到新的 commit 结点。
  4. 等待push到对应远程仓库

后记

简简单单的Git原理
参考学习如下:
www.jianshu.com/p/ddef78e9f…
juejin.cn/post/684490…


厚着脸皮的林大人的小屋系列: