如何克服解决Git冲突的恐惧症?(Git四大组件)

Git存储结构

Git有四大组件,分别是:java

  • Tag
  • Commit
  • Tree
  • Blob

当git初始化后,目录下就生成了.git文件夹,存放着与git相关的全部内容,咱们看下目录下具体的内容:git

全部的组件都存放在objects文件夹中:微信

Blob组件

当咱们执行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

Commit组件

刚刚咱们已经执行了两次git add,下面咱们将变更提交,执行git commit:blog

git commit -m "init"
复制代码

能够看到,objects中多了两个文件夹,b6和da,这两个是什么呢?咱们先用git log查看下提交日志:string

能够看到,commit的id为da7b2dd822e576db1cfb0e546a9de57fc8cfbe8b,因此da文件夹为commit组件,那么b6是什么呢?

Tree组件

b6是tree组件,每次commit时,首先会建立commit组件,而后将涉及的文件信息建立tree组件,咱们能够用git cat-file -p命令查看commit组件:

能够看到,经过git cat-file -p命令查看commit组件,能够看到tree组件,咱们用git cat-file -p来查看tree组件:

能够看到,tree组件中记录了文件的基本信息。

底层运行流程

咱们总结下git底层的运行流程:

  • 当咱们添加或者修改了文件而且add到stage区以后,会根据文件内容建立不一样的blob
  • 当进行提交以后立刻建立一个tree组件把须要的blob组件添加进去,以后再封装到一个commit组件中完成本次提交。
  • 在未来进行reset的时候能够直接使用git reset --hard xxxxx能够恢复到某个特定的版本
  • 在reset以后,git会根据这个commit组件的id快速的找到tree组件,而后根据tree找到blob组件,以后对仓库进行还原

咱们看到,git的整个过程都是以hash和二进制进行操做,因此git执行效率很是之高。

微信公众号: 码上论剑
请关注个人我的技术微信公众号,订阅更多内容
相关文章
相关标签/搜索