刚刚接触git的时候,大家都听过暂存区,这是git里的一个特殊文件,我们都知道需要先将文件放入暂存区,然后才能提交到git仓库中,但这个暂存区中到底存储了点什么呢?相信不是每个人都清楚,这篇文章,我们就来解密暂存区。
简单来说,我们平时所说的暂存区,其实就是.git/index
文件,这是一个二进制文件,格式参考下面的图:
从上图中可以看到,git暂存区文件整体包含3部分:
\0
结尾从上面的信息我们可以看到,虽然这个文件被叫做暂存区,但其实里面并没有存储实际的文件内容。另外细心的小伙伴可能注意到了,上面的size的数据类型为uint32_t
,这是一个32bit的数据类型,最大表示的范围是4G,难道git就不能存储大于4G的文件吗?其实不是的,这里的dev/ino/uid/gid/size
存储的是原始数据的低32bit,并不是完整的数据,这里只是表示文件对应的inode是否【可能】被修改过。
下面是暂存区文件内容的生成以及消费的过程
用户修改工作区中的文件内容,会有右侧的几种状态,这些状态是和暂存区中的内容进行比较。
在用户执行了git commit
后,git会将暂存区中的记录,写入tree对象中,完成最终代码入库。
可以使用下面的命令查看暂存区内容:
暂存区的存在,主要是让我们可以把多个修改合并到一起提交到git仓库,甚至在不同的时间点的操作合并到一起提交,这就带来了很大的灵活性。当然副作用就是,需要多一步的操作,不过git也提供了简化流程的方法,例如可以使用git commit -am "xxx"
一次性的完成提交暂存区和本地仓库的双操作。
【文章不错,鼓励一下】
在执行
git checkout
命令的时候,git会根据当前版本的tree
对象,生成暂存区文件内容,之后将暂存区中对应的文件内容写入到工作目录中。