Git原理-代码入库

2024/06/11 | 字数765 | 阅读2分钟


导读:有没有想过这个问题:当我们执行git add xxxgit commit -m 'xxx'的时候,Git都做了点什么?

动作分解

上面是一张简单的代码入库流程图:

用户执行git add xxx的动作分解:

  1. 为新文件创建一个blob对象文件,文件名为对文件内容计算的SHA1值高19Bytes对应的HEX(16进制字符串)值,目录为.git/objects/xx/,这里的xx为SHA1值的第1个字节对应的HEX值,注意这里创建的blob对象中存储的是源文件使用zlib压缩后的内容,并不是原始内容直接存储,这样大大降低了磁盘空间占用。
  2. 使用文件的SHA1值和文件的属性信息(大小,创建时间,修改时间、权限等)更新暂存区文件.git/index

用户执行git commit -m 'xxx'的动作分解:

  1. 根据暂存区的内容生成一个新的tree对象,同样存放到.git/objects/xx/目录下,这里在存储之前,同样会计算tree对象的SHA1值,然后进行分目录存放。
  2. 根据用户commit的消息,生成commit对象,这个对象中会记录tree对象信息,author、committer、parent、描述信息等,git同样会计算这个commit对象的SHA1值,将这个对象存放到.git/objects/xx/目录下。
  3. 将上面的commit对象的SHA1值,更新到对应的分支引用对象的文件中,一般为.git/refs/heads/master

思考

那么问题来了,如果两个文件的内容一样,那么在git中是保留一份还是两份呢?

按照步骤1中的描述我们可以得知,应该是只保留一份数据,因为文件的内容相同,SHA1值就相同,对应Git库中的BLOB对象文件名就相同,因此只能是一份记录。但这里需要注意的是,虽然文件内容相同,但文件名不同或者位于不同的目录中,因此,对应的是不同的tree对象条目。

上一篇:Git原理-垃圾回收 下一篇:Git原理-探寻日志记录

【文章不错,鼓励一下】