<.git>
├COMMIT_EDITMSG
# 最新一次提交的备注信息(并不是HEAD所指备注),git系统不会用到,给用户一个参考
├config
# 配置文件,项目用户名、邮箱在该文件配置。详解
├description
# 仓库的描述信息,主要给gitweb等git托管系统使用
├FETCH_HEAD
# 是一个版本链接,指向着目前已经从远程仓库取下来的分支的末端版本
├HEAD
#映射到
ref引用,即当前commit对象哈希值。详解
├index
# 该文件表示暂存区。详解
├ORIG_HEAD
# 当前commit对象的前一个commit对象hash值,与logs/HEAD文件的最新一行的第一个hash值保持一致。
├<hooks>
#Git执行特定事件(如commit、push、receive等)后触发运行的一些shell脚本。详解
│ ├applypatch-msg.sample
│ ├commit-msg.sample
│ ├fsmonitor-watchman.sample
│ ├post-update.sample
│ ├pre-applypatch.sample
│ ├pre-commit.sample
│ ├pre-merge-commit.sample
│ ├prepare-commit-msg.sample
│ ├pre-push.sample
│ ├pre-rebase.sample
│ ├pre-receive.sample
│ └update.sample
├<info>
# 存放仓库的信息
│ └exclude
├<logs>
# 保存所有更新的引用记录
│ ├HEAD
# (切换前的commit对象hash值,切换后的commit对象hash值,切换者,切换者邮箱,切换时间,切换操作信息)详解
│ ├<refs>
│ │ ├stash
│ │ ├<heads>
# 所有分支提交信息,保存每个分支的commit对象链详解
│ │ │ ├master
# master分支的commit对象链
│ │ │ └testchanges
# testchanges分支的commit对象链
├<objects>
#对象目录,object有:commit、tree、blob、tag
│ ├<08>
│ │ └8aa22897a71f1ff5d34eedd8b30c35997a8ce8
│ ├<0b>
│ │ └20aead00e76e9afc1ee8775b2705c77e790cf6
│ ├<12>
│ │ └d5be03b603f88bc9611979039e58848afa647b
│ ├<14>
│ │ └ed3a8427cc35eec36784d7579db54646b098e9
│ ├<15>
│ │ └aa63597ef2de8f3574b2258a912c8ab63d0694
│ ├<info>
│ └<pack>
├<refs>
#commit/tree/blob/tag对象的引用
│ ├stash
│ ├<heads>
# 当前分支的当前head指针,便于分支切换详解
│ │ ├master
# master分支当前head指针
│ │ └testchanges
# testchanges分支当前head指针
│ ├<tags>
# 保存所有的标签哈希值
│ │ └first
# 保存first标签的哈希值
│ │ └fsecond
# 保存second标签的哈希值
git是保存文件的完全的副本,而不是差异。
1. HEAD
HEAD文件放着指向当前分支的路径
refs/heads/master文件中放着master分支的当前commit对象hash值
例如:
HEAD内容
- ref: refs/heads/master
refs/heads/master文件内容
- b2100018fd07e0d26aecab6ab6c34250e48f0f3a
表示当前在master分支下,且当前commt对象为b2100018fd07e0d26aecab6ab6c34250e48f0f3a
2. index
3. logs
3.1logs/HEAD
对当前commit对象每切换一次,logs/HEAD文件增加一行。切换前后的commit对象可能不属于同一个分支,因为对当前commit对象的切换,可以在同一分支内,也可以跨分支。
返回目录树logs/HEAD>处
3.2 logs/refs/heads/
如: logs/refs/heads/master文件
在当前分支下,对当前commit对象每切换一次,logs/refs/heads/master文件增加一行。切换前后的commit对象都属于该分支,因为logs/refs/heads下的文件只保存在同一分支下的commit对象切换记录。
返回目录树logs/refs/heads>处
3.3 logs/HEAD文件与logs/refs/heads目录下的文件的异同
共同点:
- 数据格式都是相同的
不同点:
- 对于logs/HEAD文件来说,不论跨分支切换commit对象操作还是在同一分支下切换commit对象操作,该文件都会增加一条。但对于logs/refs/目录下的文件来说,在某个分支下切换commit对象时,才会在该文件中增加一条。
总结:
logs/HEAD文件内容的行数 == logs/refs/heads所有文件的行数和 + 跨分支切换commit对象操作的次数。
4. refs/heads
该文件夹下的每一个分支文件,内容始终只有一个commit对象的hash值。保存当前分支的当前head指针(即当前commit对象),目的a分支切换到b分支,保证切换前后的a分支的当前commit状态不变,使得再次切换会a分支时,a分支的当前commit对象仍然是之前的那一个。
如:master→testchanges→master,在两次切换前后refs/heads/master文件内容一直保持未变。
返回目录树<heads>处