那天下午,你在空荡荡的项目目录里敲下git init。几毫秒后,一个名叫.git的文件夹悄悄出现。你好奇心发作,点进去瞄了一眼:hooks、info、objects、refs……像打开一个精密仪器的维修盖板。Git的一切秘密,都锁在这个不起眼的隐藏文件夹里。
Git之所以能闪电般追踪成千上万个文件的变化,核心就在于它把项目的每一份快照都拆成四类“对象”。你可以把这套机制想象成四层抽屉的档案柜:
打开网易新闻 查看精彩图片
- 第一层叫blob,只管存文件内容,不关心文件名,甚至不关心文件在哪个目录里。
- 第二层叫tree,负责记录目录和文件的结构,像一张张地图,告诉你某个文件夹里有哪些文件、分别对应哪个blob对象。
- 第三层叫commit,它不光指向当时根目录的tree对象,还记下作者、时间戳、提交信息这些元数据,形成一个快照节点。
- 第四层叫tag,专门用来给特定版本贴标签,比如发布v1.0时打上一个永久标记,方便以后随时找回。
整个仓库的历史,就是这些对象不断缠绕、指向、更新的过程。每次提交,Git都会生成一系列新对象,而旧对象只要没被垃圾回收,就永远留在那里。这也解释了为什么分支切换和回滚这么快——本质上只是在不同commit对象之间移动指针罢了。
但光有对象还不够。Git怎么保证每份内容的身份独一无二、不会被张冠李戴?这就需要哈希出场了。Git采用SHA-1算法,根据内容计算出固定长度的唯一标识符,就像给每一块数据拍了一张“指纹照”。
哪怕你只改了一个字符,得到的哈希值也截然不同。有了这个特性,Git在比对文件时不需要逐行检查,直接对比哈希就知道内容是否变了。传输、存储、去重都因此变得极省资源。你每次git commit看到的那些40位十六进制串,就是这些对象的终身身份证。
当你执行git init时,Git其实已经在幕后为这套系统搭好骨架。它创建分支默认指向main(或master),预设好HEAD引用,并在objects和refs目录里腾出空间。接下来,不管你是新建文件、修改内容还是创建分支,都是在往这个数据库里写入新的对象。理解这一点,你就不再只是机械敲命令,而是在操纵一个会永远记住每一版变化的内容追踪器。
热门跟贴