题记:
近期连续写了几篇关于git的博文,大多从日常使用过程中遇到的难点入手(例如冲突、回滚、放弃本地修改),目的是希望能够让大家从博文中找到可以直接用于实战的经验,因此并没有像其他指导手册一样事无巨细、面面俱到。如果大家希望对GIT有一个全面的了解,可以直接阅读官方文档,内部也有官方翻译的各种语言版本,不建议初学者一上来直接阅读国内相关博客或其他网站的总结类文章,原因大概有两个,其一国内的总结大多是相互摘抄,或者从官方文档直接摘录,知其然但不知其所以然;其二很多总结类的博文大多是罗列指令入手,仅有的少许真实示例讲解的也多半记录不详。虽然GIT功能很复杂,但是日常开发工作中用到的比较少,因此贸然学习很多指令反而会起到副作用,影响大家的注意力。因此在这里再次强烈推荐官方文档。
背景:
上一篇博文 GIT:git代码检出与日常维护在整合诸多国外博文和官方文档的基础上,给大家讲解了git版本库的三个基本阶段(working directory、index和commit)和如何检出原始代码。博文中依然沿袭自己的风格,并没有过多的介绍指令的各种参数和格式,仅仅是以常见的默认指令为例,介绍了git checkout和git clone等几个指令。
现在总结来看,git的各种指令主要的功能和实现的结果就是使得文件在git设定的各种状态(untracked、unmodified、modified、staged)之间进行切换。而git之所以能够使得文件存在着各种不同状态,底层原因是git采用了多阶段存储的方式(GIT可以看做是一个基于内容检索——Content-Based FileSystem——的文件系统,按照不同阶段(即不同的存储位置和格式)来标记和识别所管理文件的不同状态。本文基于官方文档的10.2 Git Internals - Git Objects章节,用本地示例的方式给大家介绍GIT的底层存储机制,让大家能形成一个宏观的认识,有一个形象的理解。