git:HEAD是“当前分支”还是“当前分支的尖端”?

时间:2018-09-26 16:41:15

标签: git

在Git词汇表文档(here)中:

  1. HEAD被定义为“当前分支”。在同一段落的后面,进一步说“ HEAD是对存储库中head之一的引用”。

  2. 但是,上面的段落定义了head是什么:“在分支的 tip 处对提交的命名引用。”

This answer在StackOverflow上引用,“如O'Reilly Git书第二版第69页所述,HEAD始终引用当前分支上的最近提交< / em>”,表示“ HEAD是当前分支的提示”。

我很困惑。全大写字母HEAD是(1)当前分支,还是(2)当前分支的 tip

注意:this question无法解决我的问题。

3 个答案:

答案 0 :(得分:3)

HEAD仅是您当前指向的位置。这可以是分支(是指向提交堆栈的指针),也可以是提交本身。在典型的用例中,它将指向分支。但是,它也可以指向一个提交(此代码段假定您位于某个git repo的根目录):

(base) Matthews-MacBook-Pro:abc matt$ git checkout -b test
Switched to a new branch 'test'
(base) Matthews-MacBook-Pro:abc matt$ cat .git/HEAD
ref: refs/heads/test
(base) Matthews-MacBook-Pro:abc matt$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
(base) Matthews-MacBook-Pro:abc matt$ cat .git/HEAD
ref: refs/heads/master
(base) Matthews-MacBook-Pro:abc matt$ git log -2
commit 5d4fe79e315c302722cfdfef3dd049f720db5acc (HEAD -> master, origin/master, origin/HEAD, test)
Author: Matt Messersmith <nah@blah.com>
Date:   Tue Sep 25 20:05:38 2018 -0400

    Problem 155 sol.

commit 73cdc8f6a679664e3b92a826377b280aadf31de1
Author: Matt Messersmith <nah@blah.com>
Date:   Tue Sep 25 19:47:50 2018 -0400

    An easy warmup.
(base) Matthews-MacBook-Pro:abc matt$ git checkout 73cdc8f6a679664e3b92a826377b280aadf31de1
Note: checking out '73cdc8f6a679664e3b92a826377b280aadf31de1'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 73cdc8f An easy warmup.
(base) Matthews-MacBook-Pro:leetcode matt$ cat .git/HEAD
73cdc8f6a679664e3b92a826377b280aadf31de1

“分支”和“分支的顶端”之间的区别实际上没有多大意义。这有点像询问指针和指针的尖端之间的区别。分支仅指向事物(提交的堆栈),而HEAD的行为类似(可以指向分支或提交)。我想这可以归结为语义学和语言学。

HTH!

答案 1 :(得分:2)

两者。我们正在谈论:

  • 分支 ,从人类的角度来看,它的直观含义是:一连串的提交,从“树干”(通常为master)或地面发芽(初始提交);

  • 如Git所见,
  • 一个分支,它仅跟踪最近的提交。对于Git而言,分支只是一个指向提交链尖端的命名指针。

一旦您知道这两种定义在实践中都吻合,就没有实际的歧义。

答案 2 :(得分:2)

与文档中所说的无关(可能需要进行一些更正,不知道),HEAD始终位于您所在的位置,这很可能是分支的提示...但是可能不会。假设您检出master〜2,并且没有分支指向master〜2。然后HEAD在master〜2上,并且您正在处理分离的HEAD状态