Reference: https://www.bilibili.com/video/av77252063?vd_source=97f888e70961e81952e75ac3b392a67b https://www.lzane.com/slide/git-under-the-hood/#/ https://nanxiao.me/git-object-type-note/
eg: 在一个目录下创建项目,使用git init
初始化,并生成两个文件,使用git add
添加到暂存区。
doper@doper ~/github/project1 git init
doper@doper ~/github/project1 master echo 'this is a' > a.txt
doper@doper ~/github/project1 master echo 'this is b' > b.txt
doper@doper ~/github/project1 master ✚ ls
a.txt b.txt
此时使用tree
打印项目目录下的./git/objects
使用git cat-file
打印文件的信息,其中使用-t
参数打印git object
类型,使用-p
参数打印git object
具体内容
git-cat-file - Provide content or type and size information for repository objects
随后使用git commit
提交。
再次使用git cat-file
查看多出来的两个git object
,如下
其中tree object中一次保存了文件权限,objects类型,sha1值(key),文件名
commit object则记录了对应的commit信息
分别为tree
对象和commit
对象及一些内容
问题1: 什么是git object
,即git对象
Git 是一个内容寻址文件系统,听起来很酷。但这是什么意思呢? 这意味着,Git 的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向 Git 仓库中插入任意类型的内容,它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容。
问题2:git对象有哪些类型
Reference: https://nanxiao.me/git-object-type-note/
Commit
非常简单,只是指向了一个tree
,并且包含了作者,提交者,提交信息,和所有的直属parent commit
因此我们可以通过这个目录下找到对应的commit信息,即使commit不小心被删除了也能找回来,具体可通过reflog找到对应commit的sha1值,然后创建新的分支或将分支指向这个commit的sha1完成恢复。
具体教程: https://blog.csdn.net/ShiShiLunHui/article/details/122672703
问题3:5b/e7…..,9e/36…..这些目录信息如何得到
其实这些是对git object对象(内容及meta信息)进行sha1进行哈希,得到的key,然后通过这个唯一key找到对应的git object
首先HEAD指针明文存储在.git/HEAD
中
分支则保存在.git/refs/heads
中
tag保存在.git/refs/tags
中
然后这些分支文件的内容指向了具体某个commit
的SHA1哈希值
因此HEAD,分支,普通的tag都可简单理解为是一个指针,这个指针指向对应的commit类型的git objects。
问题: 为什么文件的权限和名字要保存tree object对象而不是blob object?
因为blob object保存的文件的内容,而若只修改文件名则需要创建新的blob object,而tree object文件大小比较小,而且节约空间
Git的大部分指令就是在操作这三个分区以及这条链。
使用reflog查看,并修改
https://blog.csdn.net/ShiShiLunHui/article/details/122672703
使用git stash命令,先将变动暂存起来,再下次需要时再恢复,但是遇到冲突时需要手动解决冲突
https://www.cnblogs.com/zndxall/archive/2018/09/04/9586088.html
对所有的commit应用该操作,然后再放回原来的commit中,但是这会更改所有git object的sha1哈希值,需要与其他还在使用这个项目的人沟通,不然commit的哈希值不一样会冲突
https://blog.csdn.net/the_power/article/details/104651772/
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3r239pw8hickk