存储对象的数据库(不可变的数据结构, 只能新增)
blob 对象, 存的是文件的内容
blob Binary Large Object 较大的二进制内容
没有文件名\时间戳一类的信息, 只有其内容的hash
blob [content size]\0[file content]
# 数据对象是被压缩处理过的, 要查看其原始内容用cat-file 命令
$ git cat-file -p <sha-1值, 这个值是文件夹的名字+文件名里面文件的名字 QAQ>
tree 对象, 目录信息
是文件信息列表
每个文件信息包括:
文件权限\文件模式\文件类型\和blob对象或子tree 对象的sha-1指针\文件名~~\上一次提交的tree 对象的引用(这个可能存在commit 对象中)~~
文件模式
100644,表明这是一个普通文件
100755,表示一个可执行文件
120000,表示一个符号链接
这些对象是源树的快照???
tree 是一个快照, source tree 的快照, 是hash tree, 源树是谁???
hash tree 哈希树 也叫 默克尔树, 每个节点都是(数据块的)hash 值
哈希树的概念以1979年获得专利的Ralph Merkle(默克尔)命名
存储格式
tree 对象的格式
tree [content size]\0[Entries having references to other trees and blobs]
tree 对象存储的条目的格式
[mode] [file/folder name]\0[SHA-1 of referencing blob or tree]
commit 对象, 上一个commit 的引用(hash), 当前快照, 作者信息 和 提交描述信息
指向当前的tree 对象, tree 对象又包含了文件内容的引用
它先指定一个顶层树对象,代表当前项目快照;然后是作者/提交者信息(依据你的 user.name 和 user.email 配置来设定,外加一个时间戳);留空一行,最后是提交注释。(还包含父提交对象)
tag 对象, 标签对象
配合标签引用使用
标签对象(tag object)非常类似于一个提交对象——它包含一个标签创建者信息、一个日期、一段注释信息,以及一个指针。 主要的区别在于,标签对象通常指向一个提交对象,而不是一个树对象。(但是可以对任意对象打标签的)
另, 所有的git 对象都是以blob 的形式存储的
疑问
(解决)tree 对象会有子树, 子树中记录其它节点文件的上一个版本
commit 对象会有上一个commit 对象的引用
存储索引的数据库(可变的数据结构)
https://git-scm.com/book/zh/v2/Git-内部原理-Git-引用
目录结构
refs/head/master
refs/head/test
就是指向commit 对象的(sha-1 值的)指针
运行类似于 git branch (branchname) 这样的命令时,Git 实际上会运行 update-ref 命令,取得当前所在分支最新提交对应的 SHA-1 值,并将其加入你想要创建的任何新引用中。
Head 引用
指向某个分支如master
master 分支保存的是commit 的sha-1 值
每次commit, 创建的commit 对象, 就会跟head 要历史(上此次commit 是哪个)然后记录
标签 引用
lightweight vs. annotated tags
轻量标签
一个名称 和 commit 对象的 sha-1 值
带注释的标签
由于使用了标签对象, 所以标签就含有了创建者的信息\注释
比如在某个提交对象上标记软件版本号, 那么可以看到是谁标记的. (看到人变似乎看到了代码质量)
使用了bolb, 但是附带了更多信息
多人合作时, 这个比较适合吧
远程引用
对远程仓库的引用
远程引用和分支(位于 refs/heads 目录下的引用)之间最主要的区别在于,远程引用是只读的。