当前位置: 首页 > news >正文

【git 基础】detached HEAD state的出现和解决

前言:


这是一个错误的提示。出现的原因是之前有一个提交。那这个提交呢是提交了一个文件,然后我因为找不到了,所以就缺靠了在这个提交的这样的一个哈希值上,这样的话后面就从这个之前的分支上分离出来,然后系统就每次提交之后呢他都会提示我,我现在是在一个分离的头上面。那么出现这个分离投的有一个坏处就是有可能你的修改会在一次合并中丢失掉,所以呢是需要解决的。


理论:

我们首先要了解什么是head。|这样才能理解什么叫分离头。

什么是 HEAD?

在 Git 中,HEAD是一个特殊的指针,它始终指向以下功能:

  • 通常指向当前所在的分支(例如 main、dev 等)
  • 间接指向该分支最新的提交 (commit)
  • 可以理解为 "你当前正在查看的位置"

正常情况下,HEAD会附着在某个分支上(称为 "attached HEAD"),当你提交新内容时,分支会随着HEAD一起向前移动。

 Head可以理解为就是一个git版本的一个指针指向的标记。

当一个提交在这个状况下生成的时候,那么分支会自动指向一个新的提交。自动指向一个分支的原因是,我们可以看到从b到c到d的这个终端它都是一个连续的直线。在这种情况下就会自动生成我们叫branch或者mastr的 head.


什么是分离头指针状态(detached HEAD state)?

HEAD直接指向某个具体的提交 (commit) 而非分支时,就处于分离头指针状态:

  • 此时git status会显示HEAD detached at <commit-hash>
  • 你看到的是项目在该特定提交时的状态
  • 这不是错误状态,而是 Git 的正常工作模式之一

这个就是前面说到的出现这个问题的原因。


为什么会进入分离头指针状态?

常见的场景包括:

  1. 检出某个具体的提交:git checkout <commit-hash>
  2. 检出标签 (tag):git checkout v1.0.0(标签本质上是特定提交的别名)
  3. 查看远程分支的特定状态而没有创建本地分支
  4. 通过 Git 历史查看工具直接跳转到历史版本

首先:在commit这里,checkout一个版本,HEAD会直接指向这个提交b。也就是head指向了一次提交。而不是指向一次有名称或者有标记定义的提交。

 Head指向了一次提交,看起来并没有什么问题。但是如果我们随后经过多次的这样的指向提交之后。

那么我们可以看到,这次已经指向了f。到目前为止还都一切正常,但是错误就会发生在下面这个操作。

当我们 check out. Master.之后。原来只像某一个特殊的comic的提交,就丢失了指向的指针。

我们看到f,它的指向丢失了。 Git.有垃圾回收机制会回收这些没有指向的提交。那么f就有可能被垃圾回收机制给清除掉。

通过构建一个新的branch,然后来避免这个问题的发生。

$ git checkout -b foo  # or "git switch -c foo"  (1)
$ git branch foo                                 (2)
$ git tag foo                                    (3)

上面这个代码就是首先check out那个b点。选择b点的原因是因为我们是从b点选择了一个commit点分离出来。在check out b之后我们用 git branch来创建一个branch foo。当然也可以用 tag来打一个标签。

这样就给detached HEAD f,一个正确的branch foo的参考,当然,也包括tag


实践:

1 git history

2 找到detached 部分

3 checkoout

4 做一个branch


问题:

如果你已经弄丢了这个detached 分支。可以用下面的方法恢复。

$ git reflog -2 HEAD # or
$ git log -g -2 HEAD

http://www.dtcms.com/a/361667.html

相关文章:

  • C++11模板优化大揭秘:让你的代码更简洁、更安全、更高效
  • javaScript变量命名规则
  • 【汇客项目】:在启动过程中报错 本来安装的是node-sass 被卸载后安装的sass ,代码中一部分出现问题
  • 【深度学习基础】深度学习中的数据增强技术:从理论到实践的解析
  • 【ARMv7】开篇:掌握ARMv7架构Soc开发技能
  • Deepoc具身智能运动控制板:赋能机器感知与决策
  • (MySQL)分布式锁
  • CCNP考试通过后多久有证书,哪里可以查询下载电子证书。
  • 重新理解图神经网络训练:数据、Batch、权重与大图
  • 深入理解零拷贝:本地IO与网络IO的性能优化利器
  • wpf之StackPanel
  • 一、Git与Gitee常见问题解答
  • 2025年数字化转型关键证书分析与选择指南
  • Spark和Spring整合处理离线数据
  • 在idea当中git的基础使用
  • Ansible变量与机密管理总结
  • 人工智能学习:什么是NLP自然语言处理
  • 【自记录】Ubuntu20.04下Python自编译
  • 全栈智算系列直播 | 智算中心对网络的需求与应对策略(上)
  • 基于FPGA的多协议视频传输IP方案
  • 【系统架构师设计(8)】需求分析之 SysML系统建模语言:从软件工程到系统工程的跨越
  • 硬件开发_基于Zigee组网的果园养殖监控系统
  • 简单高效的“色差斑块”匀色、水体修补、地物修复技巧
  • 51.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--登录注册扩展
  • 开源项目_CN版金融分析工具TradingAgents
  • Linux权限详解:从基础到实践
  • Selenium 4 文件上传和下载操作指南
  • kubernetes应用的包管理Helm工具
  • MySql blob转string
  • 15693协议ICODE SLI 系列标签应用场景说明及读、写、密钥认证操作Qt c++源码,支持统信、麒麟等国产Linux系统