Git原理-解密暂存区

2024/06/06 | 字数1054 | 阅读3分钟


刚刚接触git的时候,大家都听过暂存区,这是git里的一个特殊文件,我们都知道需要先将文件放入暂存区,然后才能提交到git仓库中,但这个暂存区中到底存储了点什么呢?相信不是每个人都清楚,这篇文章,我们就来解密暂存区。

文件格式

简单来说,我们平时所说的暂存区,其实就是.git/index文件,这是一个二进制文件,格式参考下面的图: git暂存区文件格式

从上图中可以看到,git暂存区文件整体包含3部分:

  1. 文件头
    • 签名信息,为固定字符"DIRC"
    • 文件格式的版本信息,为1或者2
    • cache-entries条目数量
  2. cache-entries:记录了当前仓库中的文件元数据信息,包括下面的一些信息
    • ctime:文件创建时间
    • mtime:上一次修改的时间
    • dev:设备信息
    • ino:inode信息
    • mode:文件权限信息,例如可读/可写/可执行等
    • uid:用户ID
    • gid:用户组ID
    • size:文件大小
    • data:HASH,flags,flags2
    • name:文件名,以\0结尾
  3. 校验和:用于判断当前文件是否合法

从上面的信息我们可以看到,虽然这个文件被叫做暂存区,但其实里面并没有存储实际的文件内容。另外细心的小伙伴可能注意到了,上面的size的数据类型为uint32_t,这是一个32bit的数据类型,最大表示的范围是4G,难道git就不能存储大于4G的文件吗?其实不是的,这里的dev/ino/uid/gid/size存储的是原始数据的低32bit,并不是完整的数据,这里只是表示文件对应的inode是否【可能】被修改过。

是怎么被使用的

下面是暂存区文件内容的生成以及消费的过程

可以使用下面的命令查看暂存区内容:

bash
1
2
3
git ls-files -s
100644 11abb9d67bb3941c8d4daa2d3bd84c91e95d0e65 0	a
100644 dad48ad8f17303cdfab1867c1522f1c807ad4f62 0	src/init.c

为什么需要暂存区

暂存区的存在,主要是让我们可以把多个修改合并到一起提交到git仓库,甚至在不同的时间点的操作合并到一起提交,这就带来了很大的灵活性。当然副作用就是,需要多一步的操作,不过git也提供了简化流程的方法,例如可以使用git commit -am "xxx"一次性的完成提交暂存区和本地仓库的双操作。

上一篇:Git原理-元数据之谜 下一篇:Git原理-细说引用文件

【文章不错,鼓励一下】