为什么我的Git repo进入了独立的HEAD状态?


Why did my Git repo enter a detached HEAD state?

我今天最终得到了一个独立的头,同样的问题如下所述:git push说一切都是最新的,即使我有本地更改

据我所知,我没有做任何与众不同的事情,只是从我当地的回购中提交和推送。

那我怎么最终得到detached HEAD


任何不是你的某个分支名称的提交签出都会让你获得一个独立的HEAD。代表分支尖端的SHA1仍会提供分离的HEAD。只有签出本地分支名称才能避免该模式。

请参阅使用分离的HEAD进行提交

When HEAD is detached, commits work like normal, except no named branch gets updated. (You can think of this as an anonymous branch.)

alt text

例如,如果您在没有先跟踪它的情况下签出"远程分支",则最终可以使用分离的HEAD。

看到git:switch分支没有分离头


我刚刚意外地复制了这个:

  • 列出远程分支

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

    1
    git checkout origin/Feature/f1234
  • 普雷斯托!独立的HEAD状态

    1
    You are in 'detached HEAD' state. [...])
  • 解决方案#1:

    检查时,不要在我的分支规范的前面包含origin/

    1
    git checkout Feature/f1234

    解决方案#2:

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

    git checkout -b origin/Feature/f1234

    git checkout -b Feature/f1234它将自动回退到原点


    尝试

    1
    git reflog

    这将为您提供HEAD和分支指针的历史记录
    在过去的地方。

    例如:

    88ea06b HEAD @ {0}:checkout:从DEVELOPMENT转移到remotes / origin / SomeNiceFeature
    e47bf80 HEAD @ {1}:拉动原点开发:快进

    这个列表的顶部是一个可能会遇到DETACHED HEAD的人
    州...检查远程跟踪分支。


    如果您尝试撤消通过重新签出文件所做的更改而不是完全正确地使用语法,则很容易发生这种情况。

    你可以查看git log的输出 - 你可以在上次成功提交后粘贴日志的尾部,我们都可以看到你做了什么。或者你可以粘贴它并在freenode IRC上的#git中很好地提问。


    如果您有一个名为与分支相同的标记,则会发生这种情况。

    示例:如果"release / 0.1"是标签名称,那么

    1
    git checkout release/0.1

    在"释放/ 0.1"处生成分离的HEAD。如果您希望release / 0.1成为分支名称,那么您会感到困惑。


    一个简单的偶然方法是将git checkout head作为HEAD的拼写错误。

    试试这个:

    1
    2
    3
    4
    5
    git init
    touch Readme.md
    git add Readme.md
    git commit
    git checkout head

    这使

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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


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

    1
    2
    3
    4
    git fetch
    git checkout origin/foo
    vi bar
    git commit -a -m 'changed bar'

    请注意,如果您这样做,任何进一步检查origin / foo的尝试都会让您回到分离头状态!

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

    这可能与你原来的问题无关,但是这个页面在google点击率很高的"git detached head",这个场景严重缺乏记录。


    当您签出提交git checkout 或远程分支时,HEAD将分离并尝试在其上创建新提交。

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

    解决此问题的另一种方法是为新创建的提交和结帐创建一个新分支。 git checkout -b

    本文说明了如何进入分离的HEAD状态。