git 基本原理

一、问题

1. 我们一般提交我们的代码。一般过程都是 git add git commit git push。那么这些过程中,git都做了什么?

二、求证

1. 我们在一个空文件里执行git init 初始化一个git项目,此时.git文件夹的目录文件为

这是,我们创建了一个a.txt文件,并在里面写入一个文本"hello"

执行命令:echo "hello" >> a.txt

注意:执行该命令记得到项目文件中执行,不要忘了,在.git文件中执行生成了

此时再进入到.git目录,查看文件结构

可以发现,这时我们的目录结构和我们之前初始化的目录结构完全没有区别。

这时,我们开始执行 git add -A

再去看看.git目录结构

这时可以看到在objects目录下多了一个ce目录和一个013625030ba8dba906f756967f9e9ca394464a的文件。

有变化了。这个文件是不是就是我们创建的呢?被git记录保存在这里了? 我们可以来看看这文件到底是啥

执行cat objects/ce/013625030ba8dba906f756967f9e9ca394464a

打印出来的是一些乱码,说明这文件很可能是二进制文件

我们再去执行git cat-file -t ce0136 ce是目录,0136为文件名称的前4个。得到运行结果

说明这个文件是blob的数据类型

这时我们再执行 git cat-file blob ce0136 (也可以执行git cat-file -p ce0136 )

得到了文件里的内容为hello。这个确实是我们写入a.txt文件里的内容

说明:执行git add -A 时,git会在缓冲区生成一个数据文件

git add 执行完后,我们再去执行git commit,看看git上有什么变化

git commit -m "feat:添加a.txt文件"

此时的目录结构为

多了19,2e两个文件夹及其俩数据文件,这是我们在分别打开这俩文件,以及COMMIT_EDITMSG和logs文件夹。

首先我们打开COMMIT_EDITMSG文件,看看你们有啥

执行命令 cat COMMIT_EDITMSG

可以发现,COMMIT_EDITMSG文件夹里是我们commit时提交的记录名

再打开logs下的master文件

运行 cat logs/refs/heads/master

可以发现,有用户信息,你的commit信息,还有一个object里的19文件夹下文件路径信息

再顺着master文件里的信息,打开19文件夹下的文件

git cat-file -p 1954f52

发现了什么? 除了我们自己的账号信息,和我们提交的commit信息外,我们主要再去看tree。

tree 这个值后面的信息是什么?是不是感觉就是把我们底下2e文件夹名称和里面的文件名称拼接在一起了?

就像是一个指针,指向这个地址一样,那我们就去看看,这里有什么吧~

执行 git cat-file -p 2e8117

原来这里是我们创建的a.txt文件的一些信息。包括文件名 a.txt,文件类型 blob, 文件数据地址:ce013625030ba8dba906f756967f9e9ca394464a

也就是说,当你执行git commit 时,git会生成一个COMMIT_EDITMSG文件记录你的commit提交信息,两个在object里的文件,一个记录用户数据及commit提交信息和文件信息的路径,一个记录文件信息及文件数据内容的路径。

再来看看.git文件夹下,/refs/heads/master 文件

执行命令 cat refs/heads/master

这是19文件夹下文件的路径地址。

总结一下:

git add 在object下生成了ce文件夹并生成了你这次修改的数据内容对象,保存成一个blob类型的数据文件(我这个例子里的内容就是hello)。

git commit 一共生成5个位置的文件,COMMIT_EDITMSG文件,log文件,refs下文件,object文件夹下生成的俩个文件

COMMIT_EDITMSG 记录你commit 时提交的信息(如我这是 feat:添加a.txt文件)

log 记录你每次commit下的操作 我这是在master分支下commit的操作及操作内容

refs 该文件下,记录了该分支提交的记录及提交信息地址 (如 我这里的就是commit后新创建的文件信息地址)

object 文件夹下 一个记录了commit的提交信息,文件信息的地址,账号信息。 另一个则记录了commit提交的文件信息及文件数据地址

所以,整体流程是,git先去refs/heads/master 里找到要提交的tree地址,再根据该地址,读取提交的信息及用户信息,以及提交文件信息的地址路径,再在该文件信息里读取到文件的信息及文件的数据地址,再读取数据

之后你可以再去尝试看看再添加一个add,commit后文件目录情况 删除一个文件后,git的情况

你删除文件时,git不会删除这个文件的数据,只会再生成一个提交记录(应该说每次commit都会生成一条),之前的commit记录也都会存在。也就是说,你删除一个文件数据,对于git来说,只是增加了一条删除记录,并不会对原来的数据进行删除,之后上传也会连带一起上传。这也是为什么能够回撤的原因。如果都删除了。那还怎么执行回到上一个提交记录呢?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值