Git 中 'detached HEAD' 是什么?

问题产生

在一个仓库里使用了类似如下的命令:

1
git checkout 39e4636

于是 Git 提示:

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. …

正常情况 (not detached)

HEAD 是什么?以下引用自Git 内部原理 - Git 引用:

HEAD 文件是一个符号引用(symbolic reference),指向目前所在的分支。 所谓符号引用, 意味着它并不像普通引用那样包含一个 SHA-1 值——它是一个指向其他引用的指针。

正常情况下 HEAD 指向一个引用(当前分支的引用),该引用又指向一个 commit。此时 我们说 HEAD 是“attach”到一个分支的。即

HEAD -> refs/heads/master -> 9cbcb8c6a4dcd0ab9cc26a7d7b4ba6fb3e90cf75

异常情况 (Detached)

HEAD 处于 Detached 情况时,它直接指向一个 commit,即:

HEAD -> 9cbcb8c6a4dcd0ab9cc26a7d7b4ba6fb3e90cf75

如果 HEAD 指向的 commit 没有被除 HEAD 之外的引用指向,则在 HEAD 改变指向之 后会无法再被引用,只能等待垃圾回收。

解决方法

知道了这些,问题的解决方法也就显得很直观了,只需 checkout 某一个 branch 即可, 此处以 master 为例:

1
git checkout master
Last Updated 2018-05-26 Sat 14:12.
Render by hexo-renderer-org with Emacs 25.2.2 (Org mode 9.1.13)
0%