2010-10-19 40 views
294

我今天结束了一个分离的头,同样的问题在描述:据git push says everything up-to-date even though I have local changes为什么我的Git仓库进入分离的HEAD状态?

,因为我知道我没有做任何不寻常的,只是犯和我的本地回购推动。

那么我怎么最终得到了detached HEAD

+11

检出远程分支似乎就像最常见的意外做法一样;另一种常见的方法是检查'branch-name @ {n}',这是'branch-name'的第n个前面的位置。但是不管怎样,在某个时刻必须有'git checkout '。如果没有响铃,那么你可能会做一些提到的事情 - 尝试做'git checkout ',并设法修改意外。 – Cascabel 2010-10-19 13:25:11

+2

为了解除分离的HEAD状态,请参阅[修复Git分离的头部?](htt号码://stackoverflow.com/q/10228760/456814)。 – 2014-05-30 05:15:08

+0

当重新绑定期间遇到冲突时,我的回购以此状态结束。幸运的是Git告诉我当我运行'git status'时应该怎么做:'所有冲突修正:运行'git rebase --continue'' – Paul 2015-05-11 13:22:26

回答

213

任何结帐的提交不是您的分支之一的名称将为您提供分离的HEAD。表示分支尖端的SHA1仍会给出分离的HEAD。只有结账本地分行名称可以避免该模式。

committing with a detached HEAD

当头部脱落,提交工作正常人一样,只是没有命名的分支得到更新。 (你可以认为这是一个匿名的分支。)

alt text

例如,如果您签一个“远程分支”不先跟踪它,你可以用一个分离的头告终。

git: switch branch without detaching head

+12

另一种可以进入分离头部状态的方式是,如果你处于交互式变形,并且您想要编辑其中一个提交。当Git让你承诺编辑时,你将处于分离状态,直到你完成rebase。 – 2013-07-09 03:48:11

+0

在这个可视化指南中,有这样的解释:'git commit文件创建一个包含最新提交内容的新提交,以及从工作目录中获取的文件的快照。此外,文件被复制到舞台上。“这些文件被复制到舞台上是什么意思?我认为这些文件是承诺的,这意味着舞台已经被清除了? – max 2013-09-03 01:46:14

+0

@max:你提到的这个提取是针对'git commit -a':这个阶段并没有被'清除'为'与新提交'相同*,这意味着任何新的修改都将被检测到'git diff',因为git diff将工作树与索引进行比较。所以这就是为什么['git commit'手册页](http://git-scm.com/docs/git-commit)将'-a'选项描述为“告诉命令自动对已被修改的文件并删除了“ – VonC 2013-09-03 05:44:07

8

如果你试图改变你们已经通过重新检查出来的文件制成,不太得到语法正确的改变它可以很容易地发生。

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

68

我刚才转载此意外:

  1. 列出远程分支

    git branch -r 
         origin/Feature/f1234 
         origin/master 
    
  2. 我想签一个地方,所以我切贴:

    git checkout origin/Feature/f1234 
    
  3. Presto!分离的头状态

    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创建一个本地分支会回落到原点自动

+7

这几乎是一个很好的答案,但是没有解释为什么你进入了一个独立的头部状态。 – Goose 2016-05-12 18:25:01

+2

我同意但它确实提供了我正在寻找的解决方案。谢谢!! – Kilmazing 2017-03-15 15:07:11

+0

我在这[其他答案](https://stackoverflow.com/a/5772882)看到'git checkout -b Feature/f1234' <=>'git branch Feature/f1234'和'git checkout Feature/f1234'。 – Armfoot 2017-07-13 18:25:10

7

尝试

git reflog 

这给你一个历史你的HEAD和分支指针 在哪里感动了过去。

例如:

88ea06b HEAD @ {0}:结帐:从开发移动到遥控器/产地/ SomeNiceFeature e47bf80 HEAD @ {1}:拉原点DEVELOPMENT:快进

这个列表的顶部是一个reasone可能会遇到DETACHED HEAD 状态...检出远程跟踪分支。

1

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

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

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

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

这可能与您的原始问题没有任何关系,但是此页面对于“git detached head”的谷歌浏览量很高,并且此场景严重不足。

1

一个简单的意外方法是做一个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 
+0

我忘了小写字母。 +1。请参阅https://stackoverflow.com/a/4381549/6309 – VonC 2017-06-08 19:00:35

+0

也在https://longair.net/blog/2012/05/07/the-most-confusing-git-terminology/中提到(查找“”HEAD “和”头“”) – VonC 2017-06-08 19:40:57

+0

@VonC:谢谢你的链接。我正在准备Git培训,我也想指出为什么它有时会令人困惑。我已经有很多例子了(比如'checkout -b'看起来像一个结帐,但实际上是分支),但另一个列表只是欢迎。 – 2017-06-08 19:45:30

1

,如果你有一个名为同一个分支标签它可以发生。

示例:if“release/0。1" 是标签名,然后

git checkout release/0.1 

在生产分离的头‘发布/ 0.1’。如果您希望发布/ 0.1的一个分支的名字,那么你会感到困惑。

相关问题