代码之家  ›  专栏  ›  技术社区  ›  Adam Bergmark

为什么我的git repo进入了独立的head状态?

git
  •  338
  • Adam Bergmark  · 技术社区  · 15 年前

    我今天以一个超然的头脑结束,同样的问题描述如下: git push says everything up-to-date even though I have local changes

    据我所知,我没有做任何异常的事情,只是承诺和推动我的本地回购。

    那我怎么会以 detached HEAD ?

    8 回复  |  直到 8 年前
        1
  •  241
  •   Community Mohan Dere    9 年前

    如果提交的任何签出不是您的分支中某个分支的名称,则将获得一个分离的头。一个代表树枝尖端的sha1仍然会产生一个分离的头。只有一个本地分支的签出 name 避免该模式。

    请参见使用分离的头提交。

    < Buff行情>

    分离head后,像正常一样提交工作,除非没有指定的分支得到更新。(你可以认为这是一个匿名分支。)

    < /块引用>

    例如,如果您在不首先跟踪的情况下签出“远程分支”,则可以以分离的头结束。

    请参见 git:switch branch without detaching head

    你的 树枝会给你一个分开的脑袋。一个代表树枝尖端的sha1仍然会产生一个分离的头。只有一家当地分行的结帐处 名称 避免这种模式。

    committing with a detached HEAD

    分离head后,像正常一样提交工作,除非没有指定的分支得到更新。(您可以将其视为匿名分支。)

    alt text

    例如,如果您签出一个“远程分支”而不首先跟踪它,那么您可以以一个分离的头结束。

    git: switch branch without detaching head

        2
  •  91
  •   Atais    10 年前

    我刚才无意中复制了这个:

    1. 列出远程分支

      git branch -r
            origin/Feature/f1234
            origin/master
      
    2. 我想在本地签出一个,所以我剪切粘贴:

      git checkout origin/Feature/f1234
      
    3. 急板地!分离头状态

      You are in 'detached HEAD' state. [...])
      

    解决方案1:

    不包括 origin/ 在我的分支规范前面检查时:

    git checkout Feature/f1234
    

    解决方案2:

    添加 -b 从远程创建本地分支的参数

    git checkout -b origin/Feature/f1234

    git checkout -b Feature/f1234 它会自动返回原点

        3
  •  12
  •   André R.    11 年前

    尝试

    git reflog 
    

    这给你一个你的头和分支指针的历史 过去搬到哪里去了。

    例如:

    88EA06B HEAD@0:检查:从开发移动到远程/源站/某些功能 e47bf80 head@1:拉动原点开发:快进

    这张单子的最上面是一个人可能会遇到一个独立的头的理由。 状态…签出远程跟踪分支。

        4
  •  8
  •   Will    15 年前

    如果您试图通过重新签出文件来撤消所做的更改,并且语法不完全正确,则很容易发生这种情况。

    您可以查看 git log -您可以在这里粘贴自上次成功提交以来的日志尾部,我们都可以看到您所做的。或者你可以把它贴在垃圾箱里,然后很好地问进去。 #git 在自由节点IRC上。

        5
  •  4
  •   radzimir    8 年前

    如果有一个与分支同名的标记,则可能发生这种情况。

    示例:如果“release/0.1”是标记名,则

    git checkout release/0.1
    

    在“释放/0.1”处产生分离的头部。如果您希望release/0.1是一个分支名称,那么您会感到困惑。

        6
  •  3
  •   Thomas Weller    9 年前

    一个简单的意外方法是 git checkout head 作为一种打字 HEAD .

    试试这个:

    git init
    touch Readme.md
    git add Readme.md
    git commit
    git checkout head
    

    给出

    Note: checking out 'head'.
    
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -b with the checkout command again. Example:
    
      git checkout -b <new-branch-name>
    
    HEAD is now at 9354043... Readme
    
        7
  •  1
  •   dspeyer    10 年前

    另一种进入Git分离头状态的方法是尝试提交到远程分支。类似:

    git fetch
    git checkout origin/foo
    vi bar
    git commit -a -m 'changed bar'
    

    请注意,如果您这样做,任何进一步尝试签出原点/foo将使您返回到分离的头部状态!

    解决方案是创建自己的本地foo分支,跟踪origin/foo,然后可以选择推送。

    这可能与你最初的问题无关,但是这个页面在google“git-detached head”的点击率很高,而且这个场景严重缺乏文档记录。

        8
  •  0
  •   Nesha Zoric    8 年前

    当您签出到提交时 git checkout <commit-hash> 或者到一个远程分支,您的头将被分离,并尝试在其上创建一个新的提交。

    任何分支或标记都无法访问的提交将被垃圾收集,并在30天后从存储库中删除。

    解决这个问题的另一种方法是为新创建的提交和签出创建一个新的分支。 git checkout -b <branch-name> <commit-hash>

    本文演示了如何 detached HEAD 状态。