Git HEAD
虽然使用 Git 很多年,但是仍然对 HEAD 没有清晰的认识。HEAD 属于隐藏于 Git 内部的东西,网上很多介绍 HEAD 的文章也总是说不清道不明,所以记录一下。
1、Git HEAD 存放位置
HEAD 其实是一个指针,内容是 .git/HEAD
文件里面的内容,它存储着当前分支的名字,我们可以打这个文件看一看:
1 |
|
我们可以得知当前处于 master
分支。如果我们继续往下走:打开 refs/heads/master
文件,一串密码映入眼帘:
1 |
|
正如每个 Git 入门教程里说的,refs/heads/master
里存储其实就是当前 commit 的引用
我们可以看下面的这张示意图,对于 HEAD 的理解将会一目了然:
可以理解为一个仓库就是一颗树,每个分支则是不同的树枝,树枝上有不同的节点(代表每一个commit),而 commit 之前也有父子关系,HEAD 指针则是指向 commit id,HEAD 所在的 commit 就是目前本地仓库的状态。
平时我们提交 commit 则是增加节点,同时 HEAD 指针后移。但 Git 的强大,不止如此,还可以通过 reset、checkout、revert、merge 和 rebase 等操作指令,花式移动指针,游走于整颗 commit 树。
2、Git HEAD 的作用
2.1、Git HEAD 的作用一:显示当前所出于哪个分支
我们查看 Git 提交日志的时候,会经常碰到 HEAD,如下所示:
1 |
|
如上所示,HEAD -> master
告诉我们当前处于 master 分支。
2.2、Git HEAD 的作用二:指代当前分支的最新提交的 commit id
当我们进行新的提交时,HEAD 会自动更新到最新的提交上。也就是说,HEAD 始终指向当前分支的最新提交。这有助于我们跟踪代码变更并回溯到特定的提交。
有时候,我们 commit 提交代码后,发现这一次 commit 的内容是有错误的,面对这种情况有两种解决方法:
- 解决方法1:修改错误内容,再次 commit 一次
- 解决方法2:使用 git reset 命令撤销这一次错误的 commit
此时,该 HEAD 出场了,它常常与 reset 连用,如下所示:
1 |
|
因为 HEAD 表示当前分支的最新提交的 commit id,上述命令的目的是将文件 file 恢复到指定的 commit id。