一、git中三大对象commit、tree和blob之间的关系
使用git最基本的命令行就是add 之后进行commit,每次commit之后才能进行push操作,这些是大家都知道的步骤。而git中的三大对象commit、tree和blob又指的是什么,它们之间又有什么关系呢,对此进行简单介绍与记录。
首先通过一幅图来进行引入
从图中可以清楚的看到,一个commit对象里面会包含有 tree(相当于文件夹)、parent、author和committer;一个tree里面会包含tree和blob(具体的内容);而一个blob指的就是具体的文件内容。在git中,blob与文件名无关,只与文件内容有关,即文件内容相同,在git中是同一个blob。
二、分支的概念
Branches are named pointers to commits:分支是指向commits的有名指针。
像上图所示,master指向具体的一个 commit:a219fd,所以 master 是一个分支;dev 指向具体的一个 commit:e78125,所以 dev 也是一个分支。
当前我们有两个问题需要解决:
分支指向的commit 保存在什么地方(即如何知道 master 分支指向的commit值)?
在多个分支的情况下,我们怎么知道当前所处的分支是哪一个?
三、HEAD指针
我们可以看到,如上图所说:
HEAD是一个特殊的指针,HEAD指针指向当前工作的分支;
HEAD指针总是指向当前工作的分支的最近(最新)一次 commit;
如上图,当前HEAD指针指向了master分支,所以当前的工作分支是 master分支;同时 master 分支指向的 commit 是 a219fd,也就是上面说的:HEAD指针总是指向工作分支的最近一次 commit。
如果需要切换分支,如切换到 dev 分支。我们可以把 HEAD指针指向 dev 分支,那么 dev 分支就是当前的工作分支了。同时 HEAD指向指向工作分支的最近一次 commit e78125。