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

Ada*_*ark 365 git

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

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

那我怎么最终得到一个detached HEAD

Von*_*onC 255

的任何检查提交不是一个名称分支机构会得到你一个分离的头.代表分支尖端的SHA1仍会提供分离的HEAD.只有签出本地分支名称才能避免该模式.

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

分离HEAD时,提交工作正常,除了没有更新命名分支.(您可以将其视为匿名分支.)

替代文字

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

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

  • 事实上,每当你通过SHA1检查任何提交时,你都会得到一个分离的HEAD*,无论它是否位于分支的顶端; 在没有获得分离的HEAD的情况下,您可以结账的唯一事情是分支名称.例如,即使`master`在上图中的`ed489`,`git checkout ed489`也会给你一个独立的HEAD,而`git checkout master`则不会. (15认同)
  • 另一种可以进入分离头状态的方法是,如果您处于交互式rebase的中间,并且您想要编辑其中一个提交.当Git在提交编辑时让你退出时,你将处于一个独立的头状态,直到你完成rebase. (12认同)
  • `"你可以把它想象成一个匿名的分支"`:)我喜欢这个比喻 (7认同)

小智 106

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

  1. 列出远程分支

    git branch -r
          origin/Feature/f1234
          origin/master
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我想在本地签出一个,所以我剪贴:

    git checkout origin/Feature/f1234
    
    Run Code Online (Sandbox Code Playgroud)
  3. 普雷斯托!独立的HEAD状态

    You are in 'detached HEAD' state. [...])
    
    Run Code Online (Sandbox Code Playgroud)

解决方案#1:

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

git checkout Feature/f1234
Run Code Online (Sandbox Code Playgroud)

解决方案#2:

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

git checkout -b origin/Feature/f1234 要么

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

  • 这几乎是一个很好的答案,但无法解释为什么你进入一个独立的头状态. (11认同)
  • 我同意,但它确实提供了我正在寻找的解决方案.谢谢!! (4认同)
  • 默认情况下,它在 origin 中查找,因此当您给出 `origin/branchname` 时,它会查找 `origin/origin/branchname` 来告诉您第一个是您使用 `-b` 的远程名称,如果您不这样做,它会创建一个分离的“匿名”分支。类似地,要从不同的远程查看,您必须提及“-b”参数,否则 git 无法知道它来自新的远程,它将查找“origin/remote/branchname”。 (2认同)
  • 解决方案1对我有用。谢谢! (2认同)
  • 关于省略“origin/”的提示就像一个魅力。谢谢! (2认同)

And*_* R. 12

尝试

git reflog 
Run Code Online (Sandbox Code Playgroud)

这将为您提供过去HEAD和分支指针移动方式的历史记录.

例如:

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

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


Tim*_*sen 9

Detached HEAD 意味着当前签出的不是本地分支。

一些会导致Detached HEAD状态的场景:

  • 如果您签出远程分支,请说origin/master。这是一个只读分支。因此,从origin/master它创建提交时将是自由浮动的,即不连接到任何分支。

  • 如果您签出特定标签或 commit。从这里进行新提交时,它将再次自由浮动,即不连接到任何分支。请注意,当一个分支被检出时,新的提交总是会自动放置在提示处。

    当您想返回并检出特定提交或标记以从那里开始工作时,您可以创建一个源自该提交的新分支并通过git checkout -b new_branch_name. 这将阻止Detached HEAD状态,因为您现在已检出分支而不是提交。


Wil*_*ill 8

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

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


Hon*_*ney 6

如果 git 要重命名,detached HEAD我会将其命名为HEAD,该 HEAD 未被分支识别并且很快就会被遗忘

我们作为人很容易记住分支名称。我们做git checkout new-button-feature/ git checkout mainmain并且new-button-feature很容易记住。我们可以做git branch并获得所有分支的列表。但是要对提交做同样的事情,你必须这样做git reflog,这是非常乏味的。因为你有成千上万的提交,但只有很少的分支。

分离提交的标识符只是它的 SHA。所以假设你检查了一个提交(不是一个分支),即你做了git checkout d747dd10e450871928a56c9cb7c6577cf61fdf31你会得到:

注意:检查“d747dd10e450871928a56c9cb7c6577cf61fdf31”。

您处于“分离头”状态。

...

然后,如果您进行了一些更改并进行了提交,那么您仍然不在分支上。

你认为你会记得提交 SHA 吗?你不会!

git 不希望这种情况发生。因此,它通知您的HEAD 未与分支关联,因此您更倾向于签出新分支。因此,该消息下方还显示:

如果你想创建一个新分支来保留你创建的提交,你可以(现在或以后)通过再次使用 -b 和 checkout 命令来这样做。例子:

git 结帐 -b


更深入一点,分支是以一种智能的方式构建的。它会在您提交时更新其 HEAD。另一方面,标签并不意味着那样。如果你签出一个标签,那么你又在一个分离的 HEAD 上。主要原因是,如果您从该标签进行新的提交,那么鉴于该提交未被任何内容(不是任何分支或标签)引用,那么它仍然被视为分离的 HEAD。

附加的 HEAD 只能在您在分支上时发生。

更多信息请看这里

HEAD 是一个指针,它直接或间接地指向一个特定的提交:

Attached HEAD 意味着它附加到某个分支(即它指向一个分支)。

分离的 HEAD 意味着它不附加到任何分支,即它直接指向某个提交。

从另一个角度来看,如果你在一个分支上,cat .git/HEAD你会得到:

ref: refs/heads/Your-current-branch-name
Run Code Online (Sandbox Code Playgroud)

然后,如果您这样做,cat refs/heads/Your-current-branch-name您还会看到您的分支指向/引用的提交的 SHA。

但是,如果您使用的是独立的 HEAD,那么cat .git/HEAD您只会获得提交的 SHA,仅此而已:

639ce5dd952a645b7c3fcbe89e88e3dd081a9912
Run Code Online (Sandbox Code Playgroud)

仅此而已,我的意思是头部没有指向任何分支。它只是直接指向一个提交。


由于所有这一切,无论何时您检出提交(不使用分支名称检出),即使该提交是分支的最新提交,您仍然处于分离的 HEAD 中,因为您的 HEAD 没有指向您当地的任何分支机构。因此,即使签出标签也会让您处于分离的 HEAD 中。除此之外,即使检查已提取到计算机中的远程分支也会导致分离的头部,即git checkout origin main也最终会成为分离的头部......

概括

以下所有情况都会导致分离头:

  • 结帐任何提交
  • 结帐任何标签
  • 结帐任何远程分支

如果您已签出当地分支机构,则您只是在附加头上


特别感谢Josh CaswellSaagar Jha帮助我解决了这个问题。

  • 确实谢谢 Saagar (https://saagarjha.com/) 和 Josh (https://github.com/jcswll, https://github.com/woolsweater)。已投赞成票。 (2认同)

rad*_*mir 5

如果您有一个与分支相同的名称,则可能会发生这种情况。

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

git checkout release/0.1
Run Code Online (Sandbox Code Playgroud)

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

  • 是的。但如何解决这个问题呢?你如何去分行结账? (2认同)

归档时间:

查看次数:

201183 次

最近记录:

5 年,11 月 前