【git】checkout时遇到的detached HEAD问题

checkout

checkout本质改变的是head指向,将进行以下步骤:

  • 将HEAD指向那个分支的最后一次commit
  • 将HEAD指向的commit里所有文件的snapshot替换掉Index区域里原来的内容
  • 将Index区域里的内容填充到Working Directory里

checkout一般有3个用法:

git checkout [<commit id>] [--] <paths>
也是这次出现错误的命令。该命令主要用于用于拿暂存区的文件覆盖工作区的文件,或者用指定提交中的文件覆盖暂存区和工作区中对应的文件。如果不填写commit id,则默认会从暂存区检出该文件,如果暂存区为空,则该文件会回滚到最近一次的提交状态。

checkout <branch>
切换分支。

git checkout -b <new_branch> [<start_point>]
分支的创建和切换。指定的 [<start_point>]是新分支的指向,否则指向当前HEAD。

※ checkout不带文件参数时与 reset --hard的区别:1. reset把branch移动到HEAD指定的地方,而checkout则把HEAD移动到另一个分支。
2. reset有可能会把working directory里未提交内容都更新掉(分支指针改变,工作区未提交的文件被覆盖,同时丢弃某个提交之后的所有提交!!!),而checkout不会去修改你在Working Directory里未提交过的文件,原因在于未提交不能切换分支,而提交后将被保留在某次commit中不会丢失,可以切回。

HEAD

正常情况下,HEAD指向一个branch,而branch又指向一个commit。

重要的一点是:HEAD只能指向本地的某个commit或者本地分支,当git checkout 远程分支,而本地又没有这个分支,此时HEAD指向commit就会进入detached HEAD state。

detached HEAD

detached HEAD state指的是HEAD指针没有指向任何的branch,而是指向了一个commit。进入 detached HEAD 状态后 git 会创建一个临时分支,但默认不保存。
现在的提交commit链在git checkout这个commit的基础上展开,但是如果直接离开到一个branch上的话,这些commits就会被当成garbage,被git garbage collection routine所回收。
但是,我们也可以保留这些commits,有下面三种方式:

$ git checkout -b foo
创建一个branch指向这个commit链,然后HEAD指向这个branch,于是HEAD就不是处于detached state。
$ git branch foo
创建一个branch指向这个commit链,但是HEAD还是处于detached state。
$ git tag foo
创建一个tag指向这个commit链,HEAD还是处于detached state。

参考资料

git checkout之一 HEAD基本和detached 状态
git的reset和checkout的区别

【git】checkout时遇到的detached HEAD问题相关推荐

  1. git checkout 时提示 “The following untracked working tree files would be overwritten by checkout“

    1 场景 在 Windows 或者 macOS 系统中,对于已经提交到仓库中的文件修改文件名的大小写,这个时候,再进行切换分支的操作,就会出现这个提示: 2 分析 由于 Windows 或者 macO ...

  2. git checkout到新的分支之后原来未提交的代码找回

    git checkout时遇到的问题 当我们使用git进行代码版本管理时,如果本地有多个并行开发的需求的话,我们会时不时地切换不同的分支.当我们基于当前分支做了一些改动,但是并没有执行git comm ...

  3. git checkout之一 HEAD基本和detached 状态

    http://blog.csdn.net/csfreebird/article/details/7583363 1.HEAD基础 git checkout 实际上是修改HEAD文件的内容,让其指向不同 ...

  4. git checkout切换到指定commit

    切换分支是 git checkout 最常见的功能,这里不做介绍,今天主要介绍下它在撤销文件改动上的应用. // 放弃单个文件修改,注意不要忘记中间的"--",不写就成了检出分支了 ...

  5. 执行git checkout -b出错的解决办法

    有一次提交代码前需要新建本地分支跟踪到远程分支aosp/ap_SC9863A_sprdroidr_trunk_20a_airtel_t19545aa1,在执行git checkout -b创建新的本地 ...

  6. git checkout简介

    git-checkout手册页 NAME名称 git-checkout - 切换分支或恢复工作树文件 SYNOPSIS概要 git checkout [-q] [-f] [-m] [<branc ...

  7. git checkout 命令所有参数用法详解

    阅读这篇文章你将得到什么? git 命令的帮助文档获取 git checkout 命令系统知识详解,所有参数哟 怎么系统学习一个git 命令 根据git 的帮助一步步的撸下去,这样够全吧 获取参考手册 ...

  8. Git 常用操作(5)- git clone/git checkout -b/git diff/git push/git pull

    1. git clone--获取远程仓库 当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容.它只会获取数据然后 让你自己合并. 然而,有一个命令叫作 git p ...

  9. Git提交时提示‘The file will have its original line endings in your working directory’

    Git提交时提示'The file will have its original line endings in your working directory' Git出现错误 git add -A ...

最新文章

  1. python的功能模块_Python的功能模块[1] - struct - struct 在网络编程中的使用
  2. 使用ANY和ALL条件
  3. 笔记-项目进度管理-估算活动顺序-依赖关系
  4. php mysql int string_php从mysql取出int数据,变成了string
  5. oracle12c安装卡住_12C rac安装卡住了
  6. 金融行业 | 电子银行系统性能优化解决方案
  7. C#如何去掉字符串中所有空格
  8. linux 远程调试
  9. MySQL索引优化讲解
  10. mysql的设计模式_数据库设计中使用设计模式
  11. jquery 封装ajax方法,关于二次封装jquery ajax办法示例详解
  12. 虚拟光驱 win7虚拟光驱下载 ultraiso
  13. 微信小程序UI组件库合集
  14. abb机器人编程指令写字_ABB机器人-编程基本指令之运动指令
  15. 关于ArcGIS的一些基础知识
  16. 暴力推导 Beta 函数与 Gamma 函数关系式
  17. 我的MacOS上的软件
  18. 【redis】Redis中的队列list实现秒杀活动抢购
  19. 企业微信开发,嵌入自定义项目,及JS-SDK的引用
  20. 1.1.2 Linux epoll详解

热门文章

  1. 绿色环保网站管理系统mysql
  2. 感冒用药指南—小病自己看
  3. 【地雷开荒技能搭配】
  4. JavaEE 网络编程示例1 UDP套接字数据报编程 == 一发一收
  5. java 高斯模糊 图片
  6. 前端如何准备大厂面试
  7. 使用Pushlet实现后台信息推送(二)
  8. Python中strip()、lstrip()、rstrip()用法
  9. 体验结果血尿酸又偏高了
  10. 人工智能芯片能为Mate 10拍照带来什么?华为工程师这么解答