这些答案中可能存在一个微妙但重要的误解。我想我应该添加我的答案来澄清它。
什么是HEAD
?
头就是你
HEAD
是一个符号引用,指向您在提交历史记录中的任何位置。无论你走到哪里,无论你做什么,它都会像影子一样跟随你。如果你做出承诺,HEAD
就会移动。如果你结账了一些东西,HEAD
就会搬家。无论你做什么,如果你在提交历史中移动到了新的地方,HEAD
它就会随着你一起移动。为了解决一个常见的误解:你无法将自己与HEAD
. 这不是分离的 HEAD 状态。如果你发现自己在想:“哦不,我处于分离的头脑状态!我失去了我的头脑!” 记住,这是你的头。头就是你。你还没有脱离头脑,你和你的头脑已经脱离了其他东西。
HEAD 可以连接什么?
HEAD
可以指向提交,是的,但通常不会。让我再说一遍。_通常HEAD
不指向提交。_它指向一个分支引用。它_附加_到该分支,当您执行某些操作(例如commit
或reset
)时,附加的分支将随着 一起移动HEAD
。您可以通过查看引擎盖下面的内容来了解它所指向的内容。
通常你会得到这样的结果:
有时你会得到这样的信息:
a3c485d9688e3c6bc14b06ca1529f0e78edd3f86
HEAD
这就是当直接指向提交时会发生的情况。这称为分离头,因为HEAD
它指向分支引用之外的其他内容。如果您在此状态下进行提交,master
则不再附加到HEAD
,将不再与您一起移动。该提交在哪里并不重要。您可以与主分支位于同一提交上,但如果HEAD
指向该提交而不是分支,则它会被分离,并且新的提交将不会与分支引用关联。
如果您尝试以下练习,您可以以图形方式查看此内容。从 git 存储库运行此命令。你会得到一些稍微不同的东西,但它们的关键部分会在那里。当需要直接检查提交时,只需使用从第一个输出中获得的任何缩写哈希(此处是a3c485d
)。
git checkout master
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD -> master)
git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD, master)
好的,所以这里的输出有一点小小的差异。直接检查提交(而不是分支)给我们一个逗号而不是箭头。你怎么看,我们是否处于分离的 HEAD 状态?HEAD 仍然指与分支名称关联的特定修订版。我们仍然_在_master 分支上,不是吗?
现在尝试:
git status
# HEAD detached at a3c485d
没有。我们处于“分离头”状态。
(HEAD -> branch)
您可以看到与 的(HEAD, branch)
相同表示git log -1
。
综上所述
HEAD
是你。它指向您查看的任何内容,无论您身在何处。通常这不是提交,而是分支。如果HEAD
_确实_指向提交(或标记),即使它与分支也指向相同的提交(或标记),您(和HEAD
)也已与该分支分离。由于您没有附加分支,因此当您进行新提交时,分支不会跟随您。HEAD
不过,会的。