文章目录
- 一、.git目录
- 二、切换分支
- 三、仓库配置信息
- 四、引用
- 五、对象
- 六、总结
一、.git目录
ls -a .git/
./ COMMIT_EDITMSG description hooks/ info/ objects/
../ config HEAD index logs/ refs/
二、切换分支
cat .git/HEAD # 通过HEAD指针,查看当前分支为master
ref: refs/heads/master
git checkout -b temp # 新建temp分支,同时切换到该分支上
Switched to a new branch 'temp'
cat .git/HEAD # 查看当前分支,已变成temp
ref: refs/heads/temp
git checkout master # 切换到master分支
Switched to branch 'master'
cat .git/HEAD # 分支切换后,HEAD又发生了变化
ref: refs/heads/master
三、仓库配置信息
在仓库配置本地用户名和邮件,配置信息是写入到.git/config
文件中的。
> git config --local user.name tom
> git config --local user.email tom@123.com
> cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[gui]
wmstate = normal
geometry = 841x483+463+62 189 218
[user]
name = tom
email = tom@123.com
> git config --list --local
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
gui.wmstate=normal
gui.geometry=841x483+463+62 189 218
user.name=tom
user.email=tom@123.com
四、引用
.git/refs/
目录下存放的有两块内容,一个是heads
,其内主要是各个分支,另一个则是tags
,即标签。
ls .git/refs/
heads/ # 分支head指向
tags/ # 标签(一般在程序开发过程中具有里程碑式的节点打上tag标签)
cd .git/refs/heads/
# heads下存放的是仓库所有分支,当切换分支时,HEAD文件就指向heads目录下不同的文件夹(对应到相应分支)
ls
master temp
cat master # master分支的哈希值 ID
c7ce7a1cd862617b218e9fee54c5bed6c7aac80a
git cat-file -t c7ce7a1cd862617b # -t查看文件类型 哈希值只需复制一段部分,确保唯一性就行
commit # 文件为commit类型
git cat-file -p c7ce7a1cd862617b # -p打印查看master分支的内容信息
tree e8789a71bf52b04c96326df1ef01d1a569bd0758
parent 0d22af8537f829c20882b0d86115e002da61ae20
author xxx <xxx@163.com> 1659336789 +0800
committer xxx <xxx@163.com> 1659336789 +0800
add css
git branch -av
* master c7ce7a1 add css
temp a6db737 add branch
五、对象
objects
目录内存放对象,其内的子文件夹都是以哈希值的前两位字符做命名。
每个object由40位字符组成,前两位字符做文件夹名,后38位做文件名。
cd .git/objects/
ls
0d/ 2f/ 54/ 7d/ a6/ b3/ c5/ c7/ e6/ e8/ info/ pack/
cd 2f/
ls
f2bcb7d18802e4ab2895f488d0f24a61040acf
git cat-file -t 2ff2bcb7d18802e # 将目录名2f和其下文件名组成新的哈希ID,获取其类型
tree
git cat-file -p 2ff2bcb7d18802e
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 index.html
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 readme
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 test1.cpp
object具体有三种:commit
、tree
和blob
,它们之间的关系为:
- commit
- tree
- tree
- blob
- blob
- blob
- tree
- blob
- tree
- parent
- author
- 等其他元素信息
- tree
可简单理解:tree
对应目录,其后会跟着blob
或tree
,blob
对应文件
文件内容相同,就认为是同一个
blob
,
Git中文件与其文件名无关,本质是根据文件的内容来产生blob
的。
git cat-file -p 0d22af8537f829 # 打印commit的信息
tree 2ff2bcb7d18802e4ab2895f488d0f24a61040acf
parent 7d1a828cc8c3e45cb98605dc9032de372e1d0c4c
author xxx <xxx@163.com> 1659336747 +0800
committer xxx <xxx@163.com> 1659336747 +0800
add index.html
git cat-file -p 2ff2bcb7d188
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 index.html
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 readme
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 test1.cpp
六、总结
.git
目录下有较多目录与文件,其中比较重要的是上文中提到的几个:HEAD
、config
、refs/
、objects/
。对于objects
要对commit
、tree
和blob
多加理解,理解其关联关系,并掌握git cat-file
命令来查看object
类型。