Git原理及底层指令

区域


1. 工作区(本地代码)      沙箱环境,可以随便修改
2. 暂存区                          积累了一定的操作,但还没决定提交
3. 版本库                          提交更改以后的版本

对象


1. Git对象  

   Key:val     组成的键值对
               键值对是blob类型

   **git对象是每个文件的映射**

2. 树对象

   作用:能够解决文件名保存问题,也允许将多个文件组织到一起
   <br>
   
   构建树对象  
   通过**update-index**命令生成树对象
   命令:  
   git update-index -add -cacheinfo 100644  
   <br>
   100644, 普通文件
   100755, 可执行文件
   120000, 表示一个符号链接
   <br>
   -add选项:  
      因为此前该文件并不在暂存区中,首次需要-add
   -cacheinfo选项:
      因为将要添加的文件位于Git数据库中,而不是位于当前目录下,所以需要cacheinfo  
      
   **树对象是对每个项目的映射**
   <br>

3. 提交对象

   **提交对象是每次提交的映射**  

初始化工作区

创建文件夹,初始化
      git init
      创建了.Git

   1. hooks    钩子,包含客户端或服务端的钩子脚本
   2. info     包含一个全局性的排除文件
   3. logs     保存日志信息
   4. **objects      目录存储所有数据内容**
   5. **refs      目录存储指向数据(分支)的提交对象的指针**
   6. config      文件包含项目特有的配置选项
   7. description    用来显示对仓库的描述信息
   8. **HEAD      文件只是目前被检出的分支**
   9. **index     文件保存暂存区信息**
 
 + 向数据库写入数据  并返回对应键值
   命令:     
         git hash -object -w -stdin  
   -w 选项指示  hash-object 命令**存储**数据对象;若不指定此选项,则改命令**仅**返回对应的**键值**  
   --stdin(standard input) 选项只是该命令从标准输入读取内容。若不指定,则需在尾部给出存储文件的内容

   + 查看Git如何存储数据
   命令:  
   find .git/objects -type f  
   一个文件对应一条内容。校验的前两个字符是路径名

   + 根据键值拉取数值
   命令:  
   git cat -file -p doqijwodjoqidjoqwiodoq
   -p 选项指示该命令自动判断内容的类型,并为我们显示格式友好的内容
   返回文件内容
   
原文地址:https://www.cnblogs.com/laoduancode/p/13253796.html