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
,master
与refs/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^^^^