使用git init
初始化之后
先来看看.git目录下所有的文件 ls -R .git
,通过这个命令可以看到递归显示.git目录下的所有文件
在对文件进行修改之后,我们可以通过git status
命令查看文件的变化情况,这里简单地以新建一个new.txt为例,内容为hello world
观察到有一个未跟踪的文件new.txt
,此时我们.git目录下的文件不会有任何变化
但是当我们使用git add
命令之后
再次使用 ls -R .git
查看,发现.git目录下较之前多了两个文件夹
-
一个是.git下的index文件
-
另一个是.git/object下3b文件夹,其中3b文件夹下还有以一串哈希值为名的文件(文件名是通过SHA1算法得出的)
先来看看e6文件夹下的那个文件,这里先来学习两个命令
git cat-file -t <foldername+filename> #查看文件类型
git cat-file -p <foldername+filename> #查看文件内容
对应如下命令:
git cat-file -t 3b18e5 ##3b是我产生的文件夹的名字,后面直接跟上子文件名字的前六位即可
git cat-file -p 3b18e5
观察到该文件的类型是bolb
,而bolb
代表该文件是用来存储内容的
可以看到该文件里存储的内容正好是new.txt里的内容hello world
也就是说它存取了new.txt文件的内容,那有没有存取new.txt这个名字呢?
实际上是没有的,我们不妨来做如下实验
- 新建一个file.txt文件
- 同样像其中输入hello world
- git add file.txt
- ls -R .git
但是既然git status
可以查看文件的状态,说明git本地肯定还是存储了关于文件名的信息
另外,说到这个以一串160bit的哈希值为名的文件,如果我们直接用cat
命令查看,得到的看似是一串乱码的东西,实际上它是把hello world压缩过后的内容
所以才要使用使用git cat-file -p ~
才能查看解压之后的内容
我们不妨来看看new.txt原本的大小和压缩后的大小,使用ls -lh ~
再来说说SHA1算法加密的字符串
我们得到的18e512dba79e4c8300dd08aeb37f8e728b8dad
这一串数字并非直接是由"hello world"经过SHA1算法加密而来
而是由字符串"bolb 12\0 hello world"加密而来
,含义分别是[文件类型 + 文件大小+ \0 +文件内容]