每个对象(object)包括三个部分:类型,大小和内容。大小就是指内容的大小,内容取决于对象的类型,有四种类型的对象:blob、tree、 commit 和 tag。
引用在 .git/refs
目录下,引用是存储最后一个 commit 的 SHA-1 值的一个文件,这就是 Git 分支的本质。
HEAD 文件是一个符号引用(symbolic reference),指向目前所在的分支。它并不像普通引用那样包含一个 SHA-1 值——它是一个指向其他引用的指针。例如,ref: refs/heads/master
。
标签引用。 标签对象(tag object)非常类似于一个提交对象——它包含一个标签创建者信息、一个日期、一段注释信息,以及一个指针。主要的区别在于,标签对象通常指向一个提交对象,而不是一个树对象。 轻量标签,像是 个永不移动的分支引用——永远指向同一个提交对象。附注标签,创建一个附注标签,Git 会创建一个标签对象,并记录一个引用来指向该标签对象,而不是直接指向提交对象。
Git 最初向磁盘中存储对象时所使用的格式被称为松散(loose)对象格式。但是,Git 会时不时地将多个这些对象打包成一个称为包文件(packfile)的二进制文件,以节省空间和提高效率。当版本库中有太多的松散对象,或者你手动执行 git gc
命令,或者你向远程服务器执行推送时,Git 都会这样做。Git 使用 zlib 压缩 .git/objects
目录里的Git对象,生成包文件(.pack
)和索引文件(.idx
)。Git 打包对象时,会查找命名及大小相近的文件,并只保存文件不同版本之间的差异内容。
[remote "origin"]
url = [<https://github.com/schacon/simplegit-progit>](<https://github.com/schacon/simplegit-progit>)
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/qa/master
“+” 号告诉 Git 即使在不能快进的情况下也要(强制)更新引用。
$ git push origin :topic
删除远程引用,因为引用规格(的格式)是 <src>:<dst>
,所以上述命令把 <src>
留空,意味着把远程版本库的 topic 分支定义为空值,也就是删除它。