深入理解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的产生

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

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值