深入理解Git原理 | detached HEAD 的含义与用法
关于detached HEAD
,在你使用Git的过程中,很可能永远不会遇到这种看似“神秘”的状态。但是,如果有那么一天,你应该很想知道究竟什么是“detached HEAD”,以及你如何能进入那个状态。
理解checkout
是如何工作的
使用“git checkout”命令,你可以切换到项目的指定版本,然后Git将所有该版本中的文件放在你当前的工作文件夹中。
通常来说,你使用分支名称与“git checkout”进行交互
$ git checkout development
然而,你也可以提供特定commit
的哈希值:
$ git checkout 56a4e5c08
Note: checking out '56a4e5c08'.
You are in 'detached HEAD' state...
当你在进行checkout
时提供了一个commit
而不是分支名称,你就进入了一种“特殊”的状态里 —— detached HEAD
。
detached HEAD
可能带来的问题
Git中的HEAD
指针能确定您当前的工作版本(以及放置在项目工作目录中的文件)。通常,当检出正确的分支名称时,Git会在您创建新提交时自动移动HEAD
指针。您将自动进入所选分支的最新提交。
当您选择通过commit
哈希值进行checkout
时,Git将不会为您执行此操作。结果是,当您进行更改并提交它们时,这些更改将不属于任何分支。
这意味着一旦你checkout
到一个不同的版本或分支,他们很容易迷路:没有被记录在分支的上下文中,你很难访问到该状态(除非你有一个强大的内存,并且能记住提交的哈希值和那个新的提交…)
detached HEAD
会在哪些情况出现
有一些情况下,detached HEAD
状态很常见:
- 子模块确实在特定提交而不是分支中检出
-
Rebase
通过在运行时创建临时detached HEAD
状态来工作
detached HEAD
不应出现的地方
另外,可能会想到另一种情况:如果要及时回顾一下您项目的旧版本呢?例如,在bug的上下文中,您希望了解旧版本中的工作原理。
这是一个完全有效且常见的用例。但是,您不必操纵自己进入detached HEAD
状态来处理它。相反,请记住Git中整个分支概念的简单和便捷:您可以简单地创建一个(临时)分支,并在完成后将其删除。
$ git checkout -b test-branch 56a4e5c08
...do your thing...
$ git checkout master
$ git branch -d test-branch
参考资料
https://www.git-tower.com/learn/git/faq/detached-head-when-checkout-commit
以上就是本文的全部内容,如果您喜欢这篇文章,欢迎将它分享给朋友们。
感谢您的阅读,祝您生活愉快!
作者:小美哥
2019-02-20