git 的新理解,原理,它是如何工作的

247 阅读3分钟
首文
  • 以前在工作中都是使用git。也都是简单的了解分支,加上git操作(pull, add, commit, push),都是简单的操作,日常提交代码是够用了。但是真正的原理没有研究过。知其形易,知其意难。
那么git的原理到底是什么?git是如何工作的?下面将一步一步的理解一下它的原理

1.首先在我执行git init的时候我们的文件夹中会出现一个.git文件,这个文件有大用

image.png

有个特别重要的文件

  1. 文件HEAD (文件指目前被检出的分支, 当前分支)
  2. index (文件保存暂存区信息)
  3. refs 目录存储指向数据(分支、远程仓库和标签等)的提交对象的指针
  4. objeacts(目录存储所有数据内容) description 文件仅供 GitWeb 程序使用。 config 文件包含项目特有的配置选项(修改作者 姓名等等 ) info 目录包含一个全局性排除(global exclude)文件 hooks 目录包含客户端或服务端的钩子脚本(hook scripts, 自行去查找资料吧)

重点 git objects(blob | tree | commit)

1.blob:

执行git add(在这有一个概念交过本地 暂存区 远程) 的时候 经过sha1算法运算将文件的(内容)进行压缩编译生成的文件 (原文档的说明:这就是开始时 Git 存储内容的方式 一个文件对应一条内容, 以该内容加上特定头部信息一起的 SHA-1 校验和为文件命名。 校验和的前两个字符用于命名子目录,余下的 38 个字符则用作文件名。)

image.png

image.png

为什么说blob是将文件的内容进行压缩编译的,下面我们将两个文件里面都写上同样的内容,在执行git add的时候我们发现在.git objects 文件夹下并没有增加新的blob文件,并且我们在查询这个文件内容的时候发现只有一个‘text1’

image.png

2.tree:

它能解决文件名保存的问题,也允许我们将多个文件组织到一起。test子目录 并不是一个数据对象,而是一个指针,其指向的是另一个树对象(我理解的tree就是文件夹)

image.png

image.png

image.png

3.commit:

commit 我们理解为快照,也就是每一次的commit 都是一个commit 对象,这个对象上面包含着当前的commit提交中有哪些的tree 与 blob

image.png

image.png

index(文件的暂存区)

git 分为3个区工作区、暂存区、储存库。 我所理解的index就是工作区于存储库之间的一个桥梁。也就是当你git add的时候,会将你的文件暂存到index。在commit的时候,提交的就是这个index。要查看什么是Index,最好的办法是用git status这条命令。这条显示可以显示哪些文件被staged(在index里面),哪些修改还没有被staged,哪些还没有被跟踪。

image.png

HEAD

个人理解的意思是指针的意思,而且它只想的是当前分支的最后一次commit。这也就说明了一个命令的问题git reset HEAD 为什么能重置到当前分支的初始状态了

image.png

文件的几种状态

1、Untracked files (未被跟踪的文件) image.png 2、 modified(有变化的文件)

image.png

数据恢复

git reflog 是可以查看当前的所有操作记录的, git 也会记录你当前的所有操作的 我们能根据这个分支的HASH 值来找到这个分支 然后重建分支 就可以拿到这个代码了