在读廖雪峰官方网站里Git教程分支管理中“创建与合并分支”开篇时,对于HEAD和master的理解有些模糊,因此想在此做以通俗透彻的解释说明。
这部分前半句,也就是:
“在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master
分支”
这部分,还是很容易理解的。确实,在跟随廖雪峰老师学习Git操作时,截止到目前,只有一条时间线(也就是一个分支),这个分支在Git里叫主分支(即master分支)。
如果从团队协作的角度来看,这条master分支,也就是我们要克隆(clone)或者推送(push)之前要同步拉取(pull)到本地的主分支master。
而后半部分,即:
“HEAD
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,HEAD
指向的就是当前分支。
一开始的时候,master
分支是一条线,Git用master
指向最新的提交,再用HEAD
指向master
,就能确定当前分支,以及当前分支的提交点:”,
却让人在理解上有些困难模糊。
关于HEAD和master的关系,我们首先需要厘清几个概念:
- 分支:
- 我们可以把分支看作是一条线段,上面刻画有每次事件发生时的时间标记。
- git可以有很多分支。不仅包括master分支,而且还可以包括任何你想要的分支。
- 以树比喻,可以把master看作是本地的必须存在的主干或者主分支,其他分支可以看作是master的分支或者分枝,但其他分支最终都会合并至master分支
- 当前分支:
- 任何时候,HEAD所指向的分支就是当前分支。
- 在无任何新建分支情况下,也就是只有master分支,HEAD所指向的分支就是当前分支master。
- 在新建分支New_Branch并指向后,HEAD所指向的分支就是当前分支New_Branch。
- 分支变化:
- 执行git commit命令,HEAD指向当前分支(不一定是master分支)最近一次提交commit后的时间标记点
- 执行git reset命令,HEAD指向reset命令后的事件的时间标记点
- git commit命令,可以更改(准确地说,是通过添加新的时间标记点来增长)当前分支线,同时使HEAD指向当前分支线上最新的时间标记点
- git reset命令,可以使HEAD重新指向当前分支线上的某个时间标记点,同时更改(准确地说,是缩短或者回退)当前分支线,并同时更新工作区内容为相应的版本
所以,在无新建并指向的的分支情况下:
可以把master当作一条有很多间隔点(HEAD~)的当前分支(时间线),因为没有其他兄弟分支。
- master是一条可变的记录提交时间的分支线。
- HEAD~是当前分支(时间线)上的时间标记点,包括HEAD、HEAD^、HEAD^^、HEAD~