1.Git版本库
Git版本库(repository)只是一个简单的数据库,其中包含所有用来维护和管理项目的修订版本和历史的信息,Git不仅提供版本库中所有文件的完整副本,还提供版本库本身的副本。
在把一个版本库clone或复制到另一个版本库的时候,Git每个版本库的配置值如用户名和Email地址都会跟着一起转移。
在版本库中,Git维护两个主要的数据库结构:对象库和索引。
1.1Git对象类型
对象库是Git版本库实现的心脏,Git放在对象库里的对象只有4种类型:
①块(blob):文件的每一个版本表示一个blob。
②目录树(tree):一个目录树对象表示一层目录信息,Git通过目录树对象来追踪文件的路径名。
$ git write-tree #捕获索引状态并把它保存到一个树对象里
$ git ls-files -s #查看索引里的文件关联
#注意:具有相同目录树对象的SHA1值是完全相同的!
#以下说明目录树的用法:
#创建一个新目录,并添加到索引中:
#生成提交树,4a8b25...是此目录树对象的SHA1值
#此时,就可以通过目录树来把一些信息提交到版本库中了!当然,平时不用这么麻烦,只要用git commit即可!
#查看提交对象的信息
③提交(commit):一个提交(commit)对象保存版本库中每一次变化的元数据。
④标签:一个标签对象分配一个任意的且人类可读的名字给一个特定对象。
标签分为两类:
①轻量级的
只是提交对象的一个引用,这些标签并不在版本库里创建永久对象。
②带附注的
GIT认为带附注的标签是“”永久的“对象。
#可以通过git tag 命令来创建一个带有提交信息、带附注且未签名的标签
$git tag -m "Tag version 1.0" V1.0 对象引用标签(40位那个)
#如下所示,利用git rev-parse 标签名可以查看标签对象的SHA1值。
1.2。索引
索引描述整个版本库的目录结构,它捕获项目在某个时刻的整体结构的一个版本。Git的关键特色之一在于它允许你用有条理的、定义好的步骤来改变索引的内容。所谓的索引就是你用git add file后添加到缓存的文件的一个版本,你可以通过GIT命令再索引中暂存变更(即添加、删除或者编辑某个文件或某些文件),索引会记录和保存好这些变更直到你准备好要git commit了。索引跟踪文件的路径名和相应的blob。
1.3Git追踪内容
首先要注意的是。Git追踪的是内容而不是文件,Git并不追踪那些与文件次相关的文件名或者是目录名。如果两个文件的内容完全一样,Git在对象库里只保存一份blob形式的内容副本,并且该文件具有唯一的SHA1值。文件内容改变,则Git会计算一个新的SHA1值,识别出它现在是一个不同的blob对象并把这个blob对象添加到对象库里。因为Git使用一个文件的全部内容散列值作为文件名,所有它必须对每个文件的完整副本进行操作。GIT用户所说的SHA1、散列码和对象ID都是指同一个东西。在互联网上,文件或者任意大小的blob都可以通过仅比较他们的SHA1标识符来判断是否相同。
1.4打包文件
Git并不是每次修改一个文件都会完全储存这两个版本文件的全部内容,而是采用一种叫做打包文件的储存机制。要创建一个打包文件,Git会定位内容非常相似的全部文件,为其中之一储存整个内容,然后计算相似文件之间的差异并只储存差异。