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 sha1sumsha256sumsha512sum
算出来的校验和长度越来越长,也越来越安全。
话说回来,git每一次的commit都会产生一个hash值。这个值是唯一的,相当于保存了每一次提交的目录树结构和具体的文件的情况。就比如给一个项目目录的所有情况打了一个快照。如果要切换到这个状态,或者使用这个状态,用hash值作为索引就能找到这个快照。