一.底层命令(Plumbing)和高层命令(Porcelain)
本质上,Git是一套内容寻址(content-addressable)文件系统,而和我们直接接触的Git界面,只不过是封装在其之上的一个应用层。
1.在Git中,那些和应用层相关的命令(也就是我们最常用的命令,如git commit、 git push等)称之为porcelain命令(高层命令);
2.而和底层相关的命令(几乎不会在日常中使用,如git hash-object、git update-index等),则称之为plumbing命令(底层命令),只要应用于Git 的内部工作机制、演示 Git 如何及为何要以这种方式工作。这些命令主要不是用来从命令行手工使用的,更多的是用来为其他工具和自定义脚本服务的
要了解Git的底层原理,就需要了解Git是如何利用底层命令来实现高层命令的。在此之前,让我们先来看一下Git的目录结构,和各个文件在Git中的作用
`3.了解git版本库中的目录结构:
创建版本库目录: mkdir ceshi-git
创建git版本库: git init
此时git会创建一个.git的目录,几乎所有 Git 存储和操作的内容都位于该目录下.
GIT的核心文件和文件夹:
1.config 文件:该文件主要记录针对该项目的一些配置信息
2.objects文件夹:该文件夹主要包含git对象,Git中的文件和一些操作都会以git对象来保存,而各个版本之间是通过版本树来组织的.
objects文件夹中会包含很多的子文件夹:
1)pack文件夹用于存储打包压缩的对象
2)info文件夹用于从打包的文件中查找git对象
3)Git对象保存在以其sha-1值的前两位为子文件夹、后38位位文件名的文件中
3.HEAD 文件:该文件指明了git branch(即当前分支)的结果,则该文件就会指向master,但是并不是存储一个master字符串,而是分支在refs中的表示,例如ref: refs/heads/master
4.index文件:该文件保存了暂存区域的信息。该文件某种程度就是缓冲区(staging area),内容包括它指向的文件的时间戳、文件名、sha1值等;
5.Refs文件夹:该文件夹存储指向数据(分支)的提交对象的指针
1)heads文件夹存储本地每一个分支最近一次commit的sha-1值,每个分支一个文件
2)remotes文件夹则记录你最后一次和每一个远程仓库的通信,Git会把你最后一次推送到这个remote的每个分支的值都记录在这个文件夹中
3)tag文件夹则是分支的别名
GIT的非核心文件和文件夹:
1.hooks 目录保存客户端或服务端钩子脚本,这些脚本主要用于在特定的命令和操作之前或者之后进行特定的处理
2.description:该文件仅供 GitWeb 程序使用;
3.branches:新版本的 Git 不再使用 branches 目录;
4.logs则记录了本地仓库和远程仓库的每一个分支的提交记录,即所有的commit对象都会被记录在这个文件夹中
5.info文件夹保存了一份不希望在.gitignore 文件中管理的忽略模式的全局可执行文件,基本也用不上
6.COMMIT_EDITMSG文件则记录了最后一次提交时的注释信息
Git的最基本的原理:.git文件夹更像是一本书,每一个版本的每一个变动都存储在这本书中,而且这本书还有一个目录,指明了不同的版本的变动内容存储在这本书的哪一页上,。