稍微补充一下
phd's answer:在Git中,
HEAD
是一个非常特殊的名称,全大写拼写如此
1。它可以被
附加(到分支名称)或者
分离。无论哪种情况,Git都能告诉你正在使用哪个
提交。
git rev-parse HEAD
将会打印出一些哈希 ID。但只有当
HEAD
附着在分支名上时,Git 才能告诉你正在使用哪个分支名。
git rev-parse --symbolic-full-name HEAD
git symbolic-ref HEAD
两个命令都会给你当前分支的名称(前缀为
refs/heads/
),如果你在一个分支上的话。如果你处于分离 HEAD 模式下,第一个命令只会打印出
HEAD
,而第二个命令则会产生错误。
$ git checkout --detach master
HEAD is now at 7c20df84bd Git 2.23-rc1
Your branch is up to date with 'origin/master'.
$ git rev-parse --symbolic-full-name HEAD
HEAD
$ git symbolic-ref HEAD
fatal: ref HEAD is not a symbolic ref
许多形式的
git checkout
都会
分离HEAD
。其中一些形式会
附加它。使用
git checkout branch-name
将其附加,而如上所示,您可以添加
--detach
以确保它变成或保持分离状态。
使用诸如7c20df84bd
之类的原始哈希ID始终导致分离的HEAD
,即使有一个或多个分支名称标识此特定提交。
请注意,您可以拥有尽可能多的分支名称,这些名称全部标识相同的提交:
$ for i in m1 m2 m3; do git branch $i master; done
$ git checkout m1
Switched to branch 'm1'
$ git rev-parse HEAD
7c20df84bd21ec0215358381844274fa10515017
$ git checkout m2
Switched to branch 'm2'
$ git rev-parse HEAD
7c20df84bd21ec0215358381844274fa10515017
如果我明确地检出
7c20df84bd21ec0215358381844274fa10515017
,那么你想让 Git 使用以下四个名称中的哪一个——
m1
、
m2
、
m3
或
master
?但它不使用它们中的任何一个:如果你想要它使用一个名称,你必须自己提供一个名称。
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
之后,我们可以删除多余的名称,以便提交
7c20df84bd21ec0215358381844274fa10515017
仅位于
master
的顶端,并且不再同时位于四个分支的顶端。
$ for i in m1 m2 m3; do git branch -d $i; done
Deleted branch m1 (was 7c20df84bd).
Deleted branch m2 (was 7c20df84bd).
Deleted branch m3 (was 7c20df84bd).
记住,
HEAD
有两个功能。它可以找到当前的
分支(名称),如果
HEAD
被分离,则无法找到;它还可以找到当前的
提交。
2 从 Git 得到的答案取决于你提出的问题:你想知道
分支名称 还是想知道
当前提交哈希值?
在某些系统上,有时可以使用小写字母拼写
head
,并获得相同的效果。然而,在添加工作树中,这种方法开始神秘地失败了。最好坚持使用全大写的
HEAD
,或者如果打字太麻烦,单个字符
@
具有相同的特殊含义。
这也可能失败,但只有在特殊状态下才会出现。您在一个新的、完全空的仓库中处于这种状态,在这种状态下,您当前的分支名称是
master
,但分支
master
本身尚不存在。这是因为分支名称必须包含某个现有的有效提交对象的哈希ID。在一个新的、完全空的仓库中,根本没有任何提交。因此,不允许存在任何分支名称。尽管如此,
HEAD
仍然附加到名称
master
上。
当你处于这种状态时,Git 的一些部分称之为“孤立分支”(orphan branch),如在
git checkout --orphan
中使用的那样,而其他部分则称之为“未出生分支”(unborn branch),如
git status
所显示的那样。你接下来所做的
下一个提交将导致分支名称的出现。该名称已经存在于某个地方,具体来说,存储在
HEAD
中,但是提交会将该名称创建为有效的
分支名称,首先创建一个有效的提交,其哈希 ID 可以由该名称持有。
git restore
命令。请参见下面的我的答案:不会出现分离的HEAD! - VonC