当前位置: 首页 > article >正文

git的底层原理

git的底层原理

三段话总结git,

1. 工作原理:git管理是一个DAG有向无环图,HEAD指针指向branch或直接指向commit,branch指向commit,commit指向tree,tree指向别的tree或直接指向blob。

2. git所管理的一个目录,几乎所有相关信息都写在.git目录下的子目录或子文件中。

3. 工作区就是编辑文件和目录的地方,也就是除过.git目录之外的,用户可以显示编辑的project目录的文件数据。暂存区(stage)就是.git/index二进制文件和.git/object/目录下新增加的blob对象,.git/index二进制文件里面保存的是git跟踪的所有文件的hash值和文件名,包括之前跟踪的,本次没有修改过的,也包括本次git add的文件。如果没有git add,即使工作区有文件新增或修改了,.git/index二进制文件也不会记录这些,.git/object/目录下不会新增blob对象。那么git add的目的就是让工作区发生的修改被记录到.git/index二进制文件中,而且同时会在.git/object/目录下产生一个新的存放blob对象的目录,这个blob在.git/object/目录下的一个新目录的文件中,这个文件的名称是git ls-files --stage看到的hash值,应该是sha1算法算出来的,这个文件里面的内容是二进制数据,用vim打开不能text显示。然后git commit的时候会产生新的tree和commit对象,HEAD指针会移动,HEAD指针的记录,和commit的log日志等。所以暂存区可能更应该理解为.git/index文件和.git/object/下的blob对象的存储,而不仅仅是.git/index文件的更新。

4. 应该可以这样说,git几乎所有的配置以及指针、索引等信息都在./git目录下,git命令调出来的信息都来自于这里面的文件。所以搞清楚git,熟悉git的底层原理和各种操作。应该都可以以这些文件为基础,这个就有点符合其作者Linus的风格了,和Linux一样,一切皆文件,越简单越好,不过度设计,脾气暴躁,简单直接,以C语言为基础,软件风格也是C语言的感觉。

上面这个图,要从右向左看

上面这个图,要从左向右看

git的每次commit都会产生一个校验和,这个校验和是通过SHA-1算法算的(Secure Hash Algorithm 1),SHA-1是一种加密散列函数,用于生成数据的唯一固定大小的哈希值。在Git中,这个哈希值用于标识对象(如commit、tree、blob等),保证了数据的完整性和版本的唯一性。

这里顺便提一下几个加密算法的情况

md5sum 

sha1sum

sha256sum

sha512sum

算出来的校验和长度越来越长,也越来越安全。

话说回来,git每一次的commit都会产生一个hash值。这个值是唯一的,相当于保存了每一次提交的目录树结构和具体的文件的情况。就比如给一个项目目录的所有情况打了一个快照。如果要切换到这个状态,或者使用这个状态,用hash值作为索引就能找到这个快照。


http://www.kler.cn/a/597184.html

相关文章:

  • 设计和布局硬件电路是嵌入式系统开发的重要环节
  • 学习记录-js进阶-性能优化
  • 安全守护:反光衣检测技术的革新之路
  • Python深度学习环境配置指南:PyTorch、CUDA、cuDNN详解
  • SSH密钥认证 + 文件系统权限控制 + Git仓库配置+封存与解封GIT仓库
  • Redis 全攻略:从基础操作到 Spring Boot 集成实战
  • uniapp可拖拽消息数徽标draggable-badge,仿手机qq聊天列表未读数徽标动效
  • 【第12节】windows sdk编程:动态链接库与静态库
  • AI代码编辑器:Cursor和Trae
  • git tag以及git
  • 有序数组双指针问题
  • OpenCV-Contrib常用扩展模块
  • 【保姆级】Ubuntu 24.04安装Docker
  • 计数组合型dp(四种小球盒子问题总结)
  • 深入理解Linux网络随笔(五):深度理解本机网络I/O
  • 希尔排序
  • vim的一般操作(分屏操作) 和 Makefile 和 gdb
  • 实验10决策树
  • 【Uniapp】关于核心页面生命周期流程详解
  • 面试题(3)