Git 对象

每个对象(object)包括三个部分:类型大小内容。大小就是指内容的大小,内容取决于对象的类型,有四种类型的对象:blob、tree、 commit 和 tag。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5bf2d989-893e-4a30-bc6e-1e49db9b55cc/git_object.png

Git 引用

引用在 .git/refs 目录下,引用是存储最后一个 commit 的 SHA-1 值的一个文件,这就是 Git 分支的本质。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6dffc24a-da5e-4639-b9be-06c839ae3985/git_refs.png

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 分支定义为空值,也就是删除它。