GIT学习笔记(4)

本文详细介绍了Git对象的分类,包括tree、commit、parent和blob,以及如何查看对象类型。同时,探讨了Git对象的保存位置、成员结构和git log的使用。进一步讨论了HEAD和master的关系,以及Git为何使用SHA1哈希值作为唯一标识的原因。最后,解释了HEAD和父提交的表示方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

git对象

git对象分类

Git对象分为 tree(目录树),commit(当前提交),parent(parent-commit,父提交,即上次提交),blob(文件)

git对象类型查看

git cat-file -t e665431
git cat-file -t 查看ID对应的对象类型,ID可以用前几位作为简写,位数没有限制,只要不与其他对象冲突即可

对象保存的位置

git对象保存在./git/objects/下,ID前两位作为文件目录,后38位作为文件名。

git对象成员结构

#图1
------------------
commit 1 
Id = e69655
Tree = f58737---------------->| tree 1     |
Parent = a088172              | Id = f58737|
Author = wz                   | files{     |
-----------------             | /          |
commit 2(parent of commit 1)  |  .         |
Id = a088172                  |  index.php-|----------->|blob 1       |
Tree = f588112                |  ..        |            |Id = fo129192|
Parent = o91929               |}           |            |CONTENT      |
Author = wz

git log

通过git log --graph commit_id命令来查看一条commit的完整结构链,通过增加--pretty=raw参数来查看每个commit的parent属性,
git log --pretty=raw --graph e675848

git的HEAD和master

如没有改动,git status -s -b会显示master(-s:精简输出,-b查看分支(Git version >= 1.7.2))
git branch是管理分支的主要命令,git branch会显示

* master

星号表明是当前工作分支
执行git log -1 HEAD或git log -1 master或git log -1 refs/heads/master在当前情况下有同样的输出,意味着HEAD,masterrefs/heads/master有同样的指向。在git版本库中,有这样几个文件

.git/HEAD
.git/logs/HEAD
.git/logs/refs/heads/master
.git/refs/heads/master

对于不在logs目录下的文件进行研究。cat ./git/HEAD显示如下内容。

ref: refs/heads/master

cat ./git/refs/heads/master会显示一个GIT ID,如果用git cat-file来查看这一id,那么结果将是commit.
(git cat-file -t ID显示类型,git cat-file -p ID显示内容)
这个commit是最新提交的commit,也就是说master指向的是最新提交的commit ID。
那么git对象成员结构图可以画的更具体

#图2
HEAD -----------> .git/refs/-------->heads-------->master----->commit 1 (见图1

结构中,.git/refs是保存引用的命名空间,.git/refs/heads下的引用又叫分支,对于master分支,可以用refs/heads/master或heads/master来表示,也可以直接用master来表示。用git rev-parse master可以直接查看master对应的commit的ID。

git sha1哈希值ID是如何生成的

哈希(hash)是一种散列算法,可以将任意长度的输入转换为固定长度的输出(数字摘要,即哈希值),著名的算法有md5和sha1等,同类型的算法还有sha-256和sha-512等等,linux下生成md5和sha1数字摘要的命令为md5sum和sha1sum。
git的ID哈希值由40个16进制数字组成。

git为何不用顺序数字表示ID?

git是分布式版本控制系统,多个用户有修改和提交权限,如果采用顺序数字,那么肯定会产生冲突,sha1值保证了每次提交的ID的唯一性。

EXTRA

master:分支master的最新提交

HEAD:版本库最近的一次提交

符号^可以代表父提交:
如HEAD^代表HEAD的父提交,HEAD^^代表HEAD^的父提交。
多个HEAD也可用数字表示,如HEAD^5 , HEAD^^2等等。

~也可以指代祖先提交:
HEAD~5 = HEAD^^^^^
a61721~4 = a61721^^^^

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值