【git】git底层原理及相关命令

写在前面

git是一款非常好用的分布式的版本控制软件,然后最近看了git底层实现的一些东西(也不是很底层),记录总结一下,以便更好的理解使用git。

本文主要是从三个对象说起。

三个对象

三个对象分别是git对象、tree对象、commit对象。

三个对象对我们理解git如何组织和保存数据,以及git的各种操作如何实现非常有帮助。

git对象

git对象对应的是单个的文件内容,保存在版本库中。

git对象没有名字,是通过文件内容的哈希值来进行标识的。

可以通过底层命令git hash-object 文件路径来查看文件的哈希值,通过git hash-object -w 文件路径生成相应的git对象保存在版本库中并返回其哈希值。

高层命令中,当使用git add的时候,其实已经生成相应文件的git对象并将其保存在版本库中,然后将哈希值放入暂存区,通过哈希值引用git对象。

以我目前的了解,应该是没有命令能删除git对象,除非你进入./git/objects目录手动删除,也就是只要执行过git add操作,git就已经帮我们将文件内容保存了,即使后续没有提交,也能找回相应的文件内容。

tree对象

tree对象对应的是项目的内容,保存在版本库中。

tree对象同样没有名字,是通过哈希值来标识。

tree对象是类似多叉树的结构,通过哈希值引用git对象和其他的tree对象,以此将不同的文件组织起来形成一个整体的项目。

可以通过底层命令git write-tree将暂存区中的对象以一颗树的形式存入版本库,并返回tree对象对应的哈希值;通过git read-tree 哈希值将对应的数对象加入暂存区(感觉没有必要把树拿入index,只拿哈希值也没什么问题,后续求证)。

commit对象

commit对象其实就是在tree对象上包装了一层,附加了一些其他的信息,比如注释,提交者等,最重要的是commit对象有一个parent指针,指向父提交对象,这是我们进行版本回退的重要依据。

可以通过底层命令git commit-tree 哈希 -p 父对象哈希创建提交对象。

总结

真正的项目版本对应的是一个commit对象,三个对象之间的关系如下图。
在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值