• detached HEAD state


    1 detached HEAD state指的是什么

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

    detached HEAD state指的是HEAD指针没有指向任何的branch,比如说它指向了一个commit。比如我在某次commit处设置了一个tagXXX,然后我git checkout tagXXX,这个时候,我的HEAD就会指向这个commit。

    2 detached HEAD state时我能做什么

    我也可以提交,这个时候,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。

    3 为什么git checkout origin/XXX远程分支的时候会让HEAD进入detached state?

    因为HEAD不能指向远程分支,它只能指向本地的某个commit或者本地分支。当"git checkout 远程分支",HEAD就会直接指向远程分支指向的commit了,HEAD指向commit就会进入detached HEAD state。

    这个时候可以

    git checkout -b web-zach --track
    HEAD就恢复正常,并且local brach web-zach就会跟踪远程分支origin/web-zach。

    当我git checkout [remote branch]了之后,出现了"detached HEAD state",然后我去看HEAD文件里面是什么,cat .git/HEAD,输出直接是一个commit id,即

    af7c2b39936019e386189a0bc80f5c85db637e2e。

    我git checkout -b new-branch remote-branch -t之后,cat .git/HEAD,输出是一个分支,如下:

    ref: refs/heads/strategy-pattern-and-sort,这个分支并且track了对应的远程分支。

    
    

    4 detached HEAD state的危害

    一旦出现detached HEAD state,切换分支之后,提交很可能就丢失了,被git回收了。因此要尽量避免出现这个状态。

    遇到bug,要到一个老的commit版本去看一下,可以在这个commit的基础上新建一个branch,问题解决了之后删除即可。

    git checkout -b new-branch-name commit

    5 git checkout的本质

    "git checkout branch-name"在于告诉git自己想要在哪个版本上工作,执行了这条命了之后,git会把这个版本的文件都放在working copy文件夹中。

  • 相关阅读:
    Linux常用命令
    IDEA神器
    Nginx配置文件变量大全
    php-fpm.conf 文件详解
    mysqlsla慢查询分析工具教程
    Nginx upstream的5种权重分配方式
    Nginx简单性能调优
    MySQL 5.5主从同步设置教程
    mongoDB中批量修改字段
    Python学习笔记第四周
  • 原文地址:https://www.cnblogs.com/hustdc/p/6444910.html
Copyright © 2020-2023  润新知