likes
comments
collection
share

Git核心概念(二): .git目录探秘

作者站长头像
站长
· 阅读数 35

在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对象根据字面上的意思很好理解,代表的就是用户的每次提交,其结构如下

Git核心概念(二):  .git目录探秘

分别包含了:指向的tree对象的指针、其父级指针、作者以及提交者、提交时的描述信息

tree

tree表示的就项目中的目录对象,其结构如下

Git核心概念(二):  .git目录探秘

描述的就是对应目录下的结构,例如包含有哪些目录、哪些文件等信息

blob

blob代表的是文件对象,其结构如下

Git核心概念(二):  .git目录探秘

另外需要注意的是git中相同的文件对应的是同一个blob

该对象描述的就是对应文件中的内容

tag

tag就不做过多介绍了,实际上就是commit的一个别名

commit、tree、blob对象之间的关系

Git核心概念(二):  .git目录探秘

总结

本篇主要介绍了.git目录下各种常用目录、文件的内容和含义;以及git主要的几种对象代表的意义以及其关联关系,了解了这些,基本对git是如何实现版本控制有一个基本的了解

系列文章(持续更新中)

Git基础概念相关文章汇总:

转载自:https://juejin.cn/post/6905747100953706509
评论
请登录