Git HEAD 详细介绍
前言
虽然我们使用Git很多年,但是仍然有很大一部分人对head没有清晰的认识。head属于隐藏于Git内部的东西,网上很多介绍head的文章也总是说不清道不明,而本文希望从表入里给大家说一下header,欢迎大家的评论和建议。
1、Git HEAD 存放位置
HEAD 指的就是 .git/HEAD
文件,它存储着当前分支的名字,我们可以打这个文件看一看:
ref: refs/heads/master
由此,我们可以得知当前所处于 master
分支。如果我们继续往下走:打开 refs/heads/master
文件,一串密码映入眼帘:
7e136f508b982790db5686482075c60ee3ee4fed
这是master分支上最新提交的commit id。
其实,我们可以看下面的这张示意图,对于header的理解将会一目了然:
2、Git HEAD 的作用
2.1、Git HEAD 的作用一:显示当前所出于哪个分支
我们查看git提交日志的时候,会经常碰到head,如下所示:
$ git log
commit c4f9d71863ab78cfca754c78e9f0f2bf66a2bd77 (HEAD -> master)
如上所示,HEAD -> master
告诉我们当前处于 master 分支。
2.2、Git HEAD 的作用二:指代当前分支的最新提交的commit id
有时候,我们commit提交代码后,发现这一次commit的内容是有错误的,面对这种情况有两种解决方法:
解决方法1:修改错误内容,再次commit一次
解决方法2:使用git reset命令撤销这一次错误的commit
此时,该head出场了,它常常与reset连用,如下所示:
$ git reset HEAD <file>
因为head表示当前分支的最新提交的commit id,上述命令的目的是将文件file恢复到指定的commit id。
扩展阅读:关于reset的用法,大家可以移步:《git reset 命令详细介绍》。
3、Git HEAD 小结
平心而论,Git HEAD 的设计思想有点混乱,它即可以指代当前分支,也可以指代当前分支的最新提交,而当前分支与最新提交本是两个不同层面的概念。针对这种混乱的情况,大家要具体事情具体分析。Git HEAD 的设计思想来源于C/C++语言中的指针,后者即可以指代数组,也可以指代数组的第一个元素。凡是出现指针的地方,都应该小心行事,面对Git HEAD,亦是如此。
4、参考
《Git入门教程》。这是一个不错的入门教程,值得分享给大家。这个教程参考Git官方文档以及网上众多Git技术博客而成,从浅入深,分析透彻,值得Git初学者和Git中级用户学习和参考。