在项目根目录中有一个隐藏的文件夹.git(当你运行git init或者初始化一个存储库时它会被创建),其中git存储了所有的“魔法位”.它并不是非常神奇 – 有一个HEAD文本文件,说明“head”所在的位置(例如当前检出分支或提交),refs目录中包含更多目录,这些目录包含与本地和远程分支名称相对应的文件 – 每个目录都是文件只是一个带有提交SHA的文本文件(就像一个字典,当你说“检出主分支!”时,git会去查找相应的文件,读取提交的内容 – 并查看提交).
提交在对象/目录中方便地引用“对象”.那个dir实际上包含了更多带有双字母名称的目录 – 前两个字母是SHA哈希 – 它与目录中的文件名一起构成了完整的哈希(提交,树或blob).在那个两个字母的目录里面,有实际的“物体”(git magic!).对象可以是“blob”或“tree”类型,前者对应于文件,后者(松散地)对应于目录.阅读docs中的git对象 – 这是一个简单的阅读,它还为您提供了一些查看单个对象的工具.
因此,如果在.git / refs / heads / master中是一个内容为a2789da8f918ef26c90e51d05de5723e5ad543a4的文本文件 – 这意味着master在该提交中.您的项目的“状态”存储在.git / objects / a2 / 789da8f918ef26c90e51d05de5723e5ad543a4中 – 这是项目目录的树对象,列出了所有文件的SHA和&那个时候项目目录中的目录.
所以,你无法真正浏览并找到来自不同分支的实际文件 – git不会以这种方式思考事物,它会将事物视为文件列表和放大器.迪尔斯.当您更改文件并提交它时,它会为该文件的内容创建一个新的“对象”,为父目录创建一个新的树对象(更新的文件更新为SHA)并写入一个提交对象(列出所有文件的树对象)项目目录中的&文件夹).或者至少这是我的理解,或多或少.
希望有助于揭开它的神秘面纱!
2017-12-21编辑:根据@Herman的评论更新了我的旧答案.对于它的价值,这里的答案可能有点“没有足够的背景信息太多”.
较短的答案 – git将所有数据存储在项目根目录的.git目录中,它存储对项目文件夹状态的引用,而不是单独的文件副本.
为了后人,如果有人在将来偶然发现这个答案 – 我强烈推荐这个课程: