Git有四大组件,分别是:java
当git初始化后,目录下就生成了.git文件夹,存放着与git相关的全部内容,咱们看下目录下具体的内容:git
全部的组件都存放在objects文件夹中:微信
当咱们执行git add README.md
后,文件夹内容以下:spa
咱们能够看到,目录中多了83目录,即blog组件,83目录中有文件名是一串UUID的文件,当咱们执行git add将文件变为staged状态后,就会在objects目录建立一个组件,组件都是以hash的二进制方式进行存储,组件的名称为文件夹名称+文件名称,全部上面的blob组件的名字即为83920ba13f0cd4e0046337313c1f0a1cfc676ad4
,这个名字是惟一的。3d
当修改README.md后再次执行git add,发现,objects目录中又多了一个blob组件:日志
注意:若是两个文件的内容同样的话,执行git add的时候,只会生成一个blob组件,不会是两个。blob组件是在代码提交到Stage区域的时候生成的,并且是之内容来生成一个字节码文件。code
能够经过git hash-object来查询文件的hash码:cdn
刚刚咱们已经执行了两次git add,下面咱们将变更提交,执行git commit:blog
git commit -m "init"
复制代码
能够看到,objects中多了两个文件夹,b6和da,这两个是什么呢?咱们先用git log查看下提交日志:string
能够看到,commit的id为da7b2dd822e576db1cfb0e546a9de57fc8cfbe8b
,因此da文件夹为commit组件,那么b6是什么呢?
b6是tree组件,每次commit时,首先会建立commit组件,而后将涉及的文件信息建立tree组件,咱们能够用git cat-file -p命令查看commit组件:
能够看到,经过git cat-file -p命令查看commit组件,能够看到tree组件,咱们用git cat-file -p来查看tree组件:
能够看到,tree组件中记录了文件的基本信息。
咱们总结下git底层的运行流程:
咱们看到,git的整个过程都是以hash和二进制进行操做,因此git执行效率很是之高。