Git中的detached HEAD

很有可能您在Git生涯中永远不会遇到这种“神秘”状态。但是,如果您有一天做,您可能想知道什么是“分离的HEAD”-以及如何达到该状态。

了解“checkout”的工作原理

使用“ git checkout ”命令,您可以确定要处理的项目版本。然后,Git将该修订的所有文件都放在您的工作副本文件夹中。

通常,您使用分支名称与“ git checkout”进行通信:

$ git checkout development

但是,您也可以提供特定提交的SHA1哈希值:

$ git checkout 56a4e5c08
Note: checking out '56a4e5c08'.

You are in 'detached HEAD' state...

这种确切的状态-当签出特定的提交而不是分支时 -称为“分离的HEAD”。

HEAD脱离的问题

Git中的HEAD指针确定您当前的工作版本(并因此确定放置在项目工作目录中的文件)。通常,当签出正确的分支名称时,Git在创建新提交时会自动将HEAD指针移动到一起。您将自动进入所选分支的最新提交。

当您改为选择检出提交哈希时,Git不会为您执行此操作。结果是,当您进行更改并提交更改时,这些更改不属于任何branch。
这意味着一旦您签出其他修订版或分支,它们就很容易丢失:没有记录在分支的上下文中,您将无法轻松访问该状态(除非您有出色的记忆力并且可以记住的提交哈希)新提交…)。

当出现分离的HEAD时

在少数情况下,分离的HEAD状态很常见:

  • 子模块是在特定的提交而不是分支中检出的。
  • Rebase通过在运行时创建临时的分离HEAD状态来工作。

 当一个分离的头应该不会出现

另外,可能会想到另一种情况:如何及时返回以尝试项目的较旧版本?例如,在错误的上下文中,您想查看在较旧的版本中情况如何。

这是一个完全有效且常见的用例。但是,您不必让自己进入独立的HEAD状态即可应对。相反,请记住分支的整个概念在Git中多么简单和便宜:您可以简单地创建一个(临时)分支,并在完成后将其删除。

$ git checkout -b test-branch 56a4e5c08

...do your thing...

$ git checkout master
$ git branch -d test-branch
如何告诉git本地分支跟踪远程分支?
如何忽略已经提交到git仓库的文件?
Tags:,