GIT 的组件
git有几个重要的组件.
- tag
- blob
- commit
- tree
blob组件
1.1 当我们执行git init时会出现一个.git的隐藏文件夹
打开.git的隐藏文件夹会看到一个objects的文件夹,是用来存放git的所有组件的.
初始化之后objects中会有info和pack两个文件夹.
创建一个文件(echo a>a.txt),使用git add. 提交到git的Stage(暂存区),此时在查看objects文件夹中
多了一个e6的文件夹,里面有一个名字很长的文件,这个文件夹就是blob 组件。每次把文件提交到Stage中,就会在objects文件中创建一个blob组件,GIT中每个组件都是以hash的二进制方式来存储,这个组件的名称就是文件夹名称+文件夹中的文件的名称,这个hash码是唯一的,也是组件的唯一标识.
1.2 blob组件并不会对文件信息进行存储,而是对文件的内容进行记录的.
添加一个文件,我们把a.txt中的内容替换成bb(原来是a),此时文件的状态变成Modified状态,再次通过git add . 提交文件到Stage。
再观察objects目录
多了一个e0的目录,虽然我们的文件没有发生变化,但是内容发生了变化,此时git会再次创建一个blob 组件存储到objects文件夹中.
1.3 我们再次创建一个和a.txt的文件内容一模一样的b.txt
执行git add . 再次观察objects目录的变化.
并没有增加任何blob组件,因为b.txt的内容和a.txt一样,所以git发现这个blob已经存在了,就不会再增加新的组件.
commit组件和tree组件
1.1 之前已经将a.txt和b.txt.提交到了暂存区中,现在执行git commit -m "xxxx" 命令,我们会发现多了两个文件夹
我们可以用git log来查看一下
我们看到了commit 6660d9293361c01277891b0db0d581f0e8622711
这就是commit组件.
1.2 commit组件在每次提交之后都会生成,当我们进行commit之后,首先会创建一个commit组件,之后把所有的文件信息创建一个tree组件,然后把Stage Area中的blob组件封装在tree中完成一次提交.
使用 git cat-file -p 6660d 查询
我们会发现commit组件下有一个tree组件,是之后cat-file一下这个tree组件,我们发现了最开始提交的两个blob组件,而在tree组件中记录了文件的基本信息。
blob commit tree 这三个组件管理着GIT的所有版本文件。