Git核心概念(二): .git目录探秘
在git init 初始化一个git仓库后,会在仓库目录下生成一个.git目录,下面进入这个目录了解下目录中各内容的含义以及git是如果实现版本控制的
.git目录下关键内容
ls -al
total 40
drwxr-xr-x 12 xxx staff 384 Dec 13 19:25 .
drwxr-xr-x 5 xxx staff 160 Dec 13 18:57 ..
-rw-r--r-- 1 xxx staff 32 Dec 13 19:02 COMMIT_EDITMSG
-rw-r--r-- 1 xxx staff 23 Dec 13 18:50 HEAD
-rw-r--r-- 1 xxx staff 137 Dec 13 18:50 config
-rw-r--r-- 1 xxx staff 73 Dec 13 18:50 description
drwxr-xr-x 13 xxx staff 416 Dec 13 18:50 hooks
-rw-r--r-- 1 xxx staff 217 Dec 13 19:02 index
drwxr-xr-x 3 xxx staff 96 Dec 13 18:50 info
drwxr-xr-x 4 xxx staff 128 Dec 13 18:57 logs
drwxr-xr-x 10 xxx staff 320 Dec 13 19:02 objects
drwxr-xr-x 4 xxx staff 128 Dec 13 18:50 refs
HEAD
HEAD
是一个文本文件,其中记录的内容为当前git正在工作于哪一个分支,当切换分支时,该文件内容也会对应变化
> cat HEAD
ref: refs/heads/master
config
config
是一个文本文件,其中记录了当前git仓库相关的配置信息,包括用户配置的用户名和邮箱
> cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
name = your name
email = your@email.com
refs
refs
是一个目录,里面包括了tags以及heads两个子目录,其中head目录下的子目录对应本地分支
> ls -al
total 8
drwxr-xr-x 3 xxx staff 96 Dec 13 19:02 .
drwxr-xr-x 4 xxx staff 128 Dec 13 18:50 ..
-rw-r--r-- 1 xxx staff 41 Dec 13 19:02 master #因为本地目前只有一个master分支,因此只有一个目录
可以发现,master文件中存储的是一个hash值,使用git cat-file
命令查看对象的类型和内容
> cat master
5dda4591f28955e4eaba649e46301e0d20869ffa
> git cat-file -t 5dda4591f28 # -t查看对象类型
commit
> git cat-file -p 5dda4591f28 # -p查看对象内容
tree ad5ba8ce8394ba313ff74503c2c8bdc07ca56331
parent 84ed89a79f290cbdab68bdc9468859a05d9fac77
author xxx <xxx@xxx.com> 1607857377 +0800
committer xxx xxx <xxx@xxx.com> 1607857377 +0800
add demo.html and modify readme
因此可以得出结论,heads目录中各文分别对应一个分支,且内容指向该分支最新一次提交(commit)
objects
objects
目录存放的是git版本控制中最为核心的内容,即各种对象,下面看下这些对象分别都是什么内容
# objects目录下面有很多零散的文件夹(命名规则是hash的前两位相同的对象放在同一目录下),这里随便找一个文件夹看下其中内容
> cd objects/5d
> ls -al
total 8
drwxr-xr-x 3 xxx staff 96 Dec 13 19:02 .
drwxr-xr-x 10 xxx staff 320 Dec 13 19:02 ..
-r--r--r-- 1 xxx staff 175 Dec 13 19:02 da4591f28955e4eaba649e46301e0d20869ffa
> git cat-file -t 5dda4591f2895 #目录名+文件名 = 完整的hash值
commit
> git cat-file -p 5dda4591f2895
tree ad5ba8ce8394ba313ff74503c2c8bdc07ca56331
parent 84ed89a79f290cbdab68bdc9468859a05d9fac77
author xxx <xxx@xxx.com> 1607857377 +0800
committer xxx <xxx@xxx.com> 1607857377 +0800
add demo.html and modify readme
可以发现,这里选择的是一个commit类型的对象,那么git中主要的对象有哪几种,分别代表什么含义呢?
git常用对象
git中常用的对象有四个,分别是tag、commit、tree和blob
对象操作
在介绍各种对象之前,先介绍下两个命令用于查看对象的类型以及内容
git cat-file -t xxxx # 查看类型
git cat-file -p xxxx # 查看内容
commit
commit对象根据字面上的意思很好理解,代表的就是用户的每次提交,其结构如下
分别包含了:指向的tree对象的指针、其父级指针、作者以及提交者、提交时的描述信息
tree
tree表示的就项目中的目录对象,其结构如下
描述的就是对应目录下的结构,例如包含有哪些目录、哪些文件等信息
blob
blob代表的是文件对象,其结构如下
另外需要注意的是git中相同的文件对应的是同一个blob
该对象描述的就是对应文件中的内容
tag
tag就不做过多介绍了,实际上就是commit的一个别名
commit、tree、blob对象之间的关系
总结
本篇主要介绍了.git目录下各种常用目录、文件的内容和含义;以及git主要的几种对象代表的意义以及其关联关系,了解了这些,基本对git是如何实现版本控制有一个基本的了解
系列文章(持续更新中)
Git基础概念相关文章汇总:
转载自:https://juejin.cn/post/6905747100953706509