Git本地仓库组成与运作
1 Git对象
Git的对象存放于.git/object文件下。
支撑了用户在Git的工作区随意切换仓库和已包含的分支或节点。
Git有四种对象:标签对象,提交对象,树对象,块对象。他们之间层层指向。
标签对象 tag通常用作某个提交对象的别名,如Branch name和Tag name
提交对象 commit指向一个目录树的对象
树对象 tree指向下一级树对象或者当前目录下的文件
块对象 blob存储了项目文件的实际数据
**Git对象间的关联查找:**通过键值对层层实现。Git项目仓库也被称为键值对型文件数据库。
**Git对象的键:**是依据其对应的工作区的文件内容等信息,通过SHA-1等散列函数计算得到的。
2 Git包文件
越详细的信息意味着越大的空间开销与传输开销,Git对象会随着项目提交而逐渐浮肿。通过git gc命令将其压缩打包成为体积更小的二进制包文件(pack file)
如果存在太多松散对象(loose object,不在packfile中的对象)或pack file,Git会自动运行auto gc命令。收集所有松散对象并将他们存入pack file;合并这些pack file为一个较大的pack file;将不被任何commit引用并且已经存在一段时间的对象删除。
关闭auto gc命令:执行git config gc.auto 0关闭auto gc,Git命令执行过程中不再受gc中断干扰。
手动执行垃圾收集命令:执行git gc --auto来清理臃肿的对象文件,并优化本地存储库
3 Git索引
Git索引是工作区与仓库区的中转站。
Git索引从文件角度讲是.git项目仓库下的index文件;功能逻辑上讲也叫暂存区(stage area)。
Git索引是一个临时的、动态的二进制文件,他描述整个版本库的目录结构。
暂存区支撑了Git灵活的原子性提交,实现分步使用git add
暂存区支持用户灵活回退的操作空间,提升效率