Git如何通过简短的SHA-1哈希存储及还原大量数据?
Git哈希与文件存储的真相
你完全搞错了逻辑——Git绝对不可能只靠40位SHA-1哈希还原出完整文件,哈希本身是单向生成的,根本没法反向推导内容。你觉得像“魔法”,是因为误解了Git的存储机制:
- 哈希只是文件内容的唯一指纹+索引键:当你执行
git add或提交时,Git会把文件内容压缩成一个二进制对象,然后基于这个对象的内容计算出SHA-1哈希。这个哈希的作用是:一是校验内容有没有被篡改(只要内容变,哈希就变);二是作为这个压缩对象的“文件名”。 - 实际文件内容存在本地仓库里:Git会把压缩后的文件对象存在
.git/objects目录下,用哈希的前两位字符作为子目录名,剩下的38位作为文件名。比如哈希是a1b2c3...,对应的文件就存在.git/objects/a1/b2c3...里。你可以用git cat-file -p <哈希值>命令直接查看这个文件对象的原始内容,这就能证明实际内容是实实在在存储着的。 - 提交记录里的哈希只是“引用”:Git的提交、树结构里确实只存储哈希,但这些哈希都是指向
.git/objects里对应对象的指针,不是凭空生成内容的魔法密钥。比如你看某个提交的树对象,里面列的是各个文件的哈希,Git拿到哈希后,就去.git/objects里找到对应的压缩文件,解压后还原出原始内容。
简单说:哈希是“地址”,不是“内容生成器”,Git靠哈希找到已经存在的文件内容,而不是从哈希变出内容。
内容的提问来源于stack exchange,提问作者mars8
相关产品推荐
相关产品推荐

