在 Git 中,我们将 .git
目录的内容称为“附属于该仓库的工作树”。文件的编辑等操作在工作树中进行,然后记录到仓库中,以此管理文件的历史快照。如果想将文件恢复到原先的状态,可以从仓库中调取之前的快照,在工作树中打开。
当在一个新目录或已有目录执行 git init
时,Git 会创建一个 .git
目录。这个目录包含了几乎所有 Git 存储和操作的对象。对于一个全新的 git init
版本库,该目录的默认结构如下:
$ ls -F1
hooks/
info/
objects/
refs/
config
description
HEAD
当克隆一个仓库后,Git 也会初始化一个 .git
目录,从远程仓库拉取所有数据放入其中,然后从中读取最新版本的文件的拷贝。Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要的文件。
所以,如果想备份或复制一个版本库,只需把这个 .git
目录拷贝至另一处即可。
下面对该目录的内容进行简单的介绍:
-
hooks/
目录包含客户端或服务端的钩子脚本(hook scripts)。 -
info/
目录包含一个全局性排除(global exclude)文件,用以放置那些不希望被记录在.gitignore
文件中的忽略模式(ignored patterns)。 -
objects/
目录存储所有数据内容,包括数据对象(blob)、树对象(tree object)、提交对象(commit object)和标签对象(tag object)。 -
refs/
目录存储所有的引用,包括分支、标签引用和远程引用。引用实际上是指向一个提交对象的指针。 -
config
文件包含项目特有的配置选项。 -
description
文件仅供 GitWeb 程序使用,我们无需关心。 -
HEAD
文件指示目前被检出的分支。注意,HEAD 文件是一个符号引用,它并不像普通引用那样指向一个提交对象——它是一个指向其他引用的指针。
其中,HEAD
文件、index
文件(尚待创建,用于保存暂存区信息),和 objects/
目录、refs/
目录 是 Git 的核心组成部分。