【Git】04 .git目录


文章目录

  • 一、.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 [email protected]

> 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 = [email protected]

> 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=[email protected]

四、引用

.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 <[email protected]> 1659336789 +0800
committer xxx <[email protected]> 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具体有三种:committreeblob,它们之间的关系为:

  • commit
    • tree
      • tree
        • blob
      • blob
      • blob
      • tree
        • blob
    • parent
    • author
    • 等其他元素信息

【Git】04 .git目录_第1张图片

可简单理解:tree对应目录,其后会跟着blobtreeblob对应文件

文件内容相同,就认为是同一个blob
Git中文件与其文件名无关,本质是根据文件的内容来产生blob的。

git cat-file -p 0d22af8537f829   # 打印commit的信息
tree 2ff2bcb7d18802e4ab2895f488d0f24a61040acf
parent 7d1a828cc8c3e45cb98605dc9032de372e1d0c4c
author xxx <[email protected]> 1659336747 +0800
committer xxx <[email protected]> 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目录下有较多目录与文件,其中比较重要的是上文中提到的几个:HEADconfigrefs/objects/。对于objects要对committreeblob多加理解,理解其关联关系,并掌握git cat-file命令来查看object类型。


你可能感兴趣的:(Git,git)