本系列教程将会发布在微信圈子「GitHub」中,既然你已经找到了这里,那么我就直接假设基础的 Git 用法你已经掌握了(这种假设是有依据的,依据就是你已经找到了这个圈子,对 Git 不熟悉或者不了解的人不太可能看到此文),因此,本文只会介绍那些非基础用法,了解这些,可能对你以后的工作或学习会有帮助。让我们开始吧!
知其然,知其所以然会更好的理解 Git,Git 文件的存储方式,这个问题很重要,但又被大部分的的人忽略了,因此我们第一课就聊一聊 Git 的文件存储方式。
Git 文件系统是 增量式 的。这意味着你在执行 Git 命令时,一般是网 Git 的文件系统中添加文件,而不会修改或删除文件,这就意味着不太可能会丢失内容。这也就意味着一年前你写了一个 BUG,过了一年,你也抵赖不了!
Git 文件系统是 快照式 的。聊起快照式,就需要与差异式(许多其他的版本管理系统所采用的方式)进行对比。差异式,指的是每个版本存储的是与前一个版本的差异信息,那就意味着如果一个文件,十次提交中都进行了修改,就需要保存基础文件和十次差异,回看第五次,就需要计算五次,想起来都麻烦。而对比快照式,修改了文件,保存时就保存成一个新的文件,提交记录就是这些文件的索引,查看第五次提交和第一百次提交,都是拿出提交记录里索引的文件,速度是几乎没什么差别。没看懂?没关系,我们举个例子。
某一次的提交 commit 号是 f34d91(对应的是 .git/object/ 目录下的一个文件),我们用命令 git cat-file -p 查看其内容:
这里我们感兴趣的是 tree(对应的也是 .git/object/ 目录下的一个文件),继续查看其内容:
再对应这我们现在 git 仓库中的文件:
这次应该理解上面所所的快照的含义了,所有的文件都是 blob,所有的文件夹都是 tree,每一次提交的 commit 都是一个 tree。这样,就可以高效的进行 checkout 了。在不同的分支之间,这种快照的机制也有很大的好处。
思考一下,有哪些好处呢?