git三区
git三大区:工作区、暂存区和git版本库
1.git版本库
先从git版本库说起,git版本库对应.git/目录,里面的文件记录了整个仓库的文件内容、目录结构、commit信息和分支信息
2.工作区
工作区working tree对应硬盘上的代码文件,对代码进行编辑就发生在工作区。假设工作区的某个文件f 内容改变,经过 git add f 会在git仓库中产生对应的blob文件,可以在.git/objects下找到。blob文件以其sha1值命名,如58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c,文件内部记录了f文件修改后的全部内容(而不只是被修改的那部分内容),可使用git cat-file -p filename查看内容,使用git cat-file -t filename查看文件类型。
% git cat-file -p 58c9
111 ----->原有内容
20210715 add -------->新增内容
% git cat-file -t 58c9
blob
这时,暂存区的索引将文件f指向新产生的blob文件,意味着文件f从工作区进入了暂存区。这也就是1中提到的关于文件内容的记录
3.暂存区
暂存区也叫索引区index area,git commit 之后,同样会在.git/objects下生成若干个以其sha1值命名的tree文件和1个commit文件,分别记录了commit时的目录结构和commit信息,对应1中所述
3.1 tree文件示例
tree文件的sha1值为df000d3eda8ddc32f967d3952c46e3323f0cf143
% git cat-file -t df00
tree
% git cat-file -p df00
100644 blob 58c9bdf9d017fcd178dc8c073cbfcbb7ff240d6c test.txt
实际上,这个tree文件示例非常简单,它对应的是一个git仓库内只有一个test.txt的情况。当情况更为复杂,目录层级和文件增多时,一个tree文件也将变得复杂,例如:
仓库testgit
这是一个git仓库的顶层目录结构,对应的tree文件为:
% git cat-file -t 2d68
tree
% git cat-file -p 2d68
040000 tree 56cda59f78500ed97ad091a9c6e614c3f009d428 d1
100644 blob 96de81c7d8149d1537c0186852707435ee466cee test.txt
100644 blob a5bce3fd2565d8f458555a0c6f42d0504a848bd5 test1.txt
可以发现,这个2d68的tree文件内除了记录了2个txt文件,还记录了一个tree文件,对应d1目录。这表明,一个tree实际上对应一层的目录结构
3.2 commit文件示例
commit文件的sha1值为90458f95cab4b136bfeab4f7dfeeee3f327fdee3
% git cat-file -t 9045
commit
% git cat-file -p 9045
tree df000d3eda8ddc32f967d3952c46e3323f0cf143
author xxx <xxx@xxx.com> 1626269618 +0800
committer xxx <xxx@xxx.com> 1626269618 +0800
add test.txt -----> commit的注释
可以总结得到,git的存储逻辑基本上是,一个commit文件指向一个tree文件,一个tree文件又指向若干个tree文件和blob文件,一个blob文件记录了工作区对应文件的内容,而再通过.git/HEAD这个头指针文件和.git/refs下的heads来存储分支信息
xxx@xxx-MB0 .git % cat HEAD
ref: refs/heads/master
xxx@xxx-MB0 .git % cat refs/heads/master
56911a2e7c7b1549ec88f2bfe9d77710b901389e
xxx@xxx-MB0 .git % git cat-file -p refs/heads/master
tree 2d6899d21198d5c7bfc16d74ad812a179f617e88 --->testgit的顶层tree文件
parent 5e95ad6c966721b15e8eb0c9ce941018da108ca3
author xxx<xxx@xxx.com> 1626317303 +0800
committer xxx<xxx@xxx.com> 1626317303 +0800
add directory
参考:知乎-这才是真正的git
网友评论