【问题标题】:How did I end up with a detached HEAD?我是如何得到一个分离的 HEAD 的?
【发布时间】:2016-01-25 08:22:41
【问题描述】:

我从 master 签出了一个提交/分支,然后签回 master 并写了一些东西。在那之后,我犯了,但我最终得到了一个分离的 HEAD。为什么?

这是我所做的:

  1. 创建一个新项目并创建 git 存储库。
  2. git 添加
  3. git 提交
  4. 输入一些单词
  5. git 提交
  6. 结帐到上一次提交
  7. 结帐回来

  8. 输入一些单词

  9. 尝试提交;它提示有一个分离的头。

IntelliJ IDEA 的控制台显示:

17:08:58.143: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:08:58.143: git init
Initialized empty Git repository in C:/Users/jiahao/IdeaProjects/testtt/src/.git/
17:09:16.331: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:16.331: git -c core.quotepath=false add --ignore-errors -- C.java
17:09:24.407: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:24.407: git -c core.quotepath=false commit --only -F C:\Users\jiahao\AppData\Local\Temp\git-commit-msg-0.txt -- C.java
[master (root-commit) 22d1c79] first commit
 1 file changed, 6 insertions(+)
 create mode 100644 C.java

17:09:38.060: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:38.060: git -c core.quotepath=false commit --only -F C:\Users\jiahao\AppData\Local\Temp\git-commit-msg-0.txt -- C.java
[master 69084f3] second commit
 1 file changed, 1 insertion(+)

17:09:44.136: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:44.136: git -c core.quotepath=false checkout 22d1c7919eab50925411d9bbb8a9ad1575608c27
Note: checking out '22d1c7919eab50925411d9bbb8a9ad1575608c27'.
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 22d1c79... first commit
17:09:46.576: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:46.576: git -c core.quotepath=false checkout 69084f344b79a48da92855d3fb633a28a672a302
Previous HEAD position was 22d1c79... first commit
HEAD is now at 69084f3... second commit
17:18:26.999: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:18:26.999: git -c core.quotepath=false commit --only -F         C:\Users\jiahao\AppData\Local\Temp\git-commit-msg-0.txt -- C.java
[detached HEAD 783fbf2] third commit
1 file changed, 1 insertion(+)

【问题讨论】:

  • 我怀疑你没有只是结帐给主人。如果您能给出一个完整的示例(从git init 开始),说明重现问题的确切 组步骤,将会有所帮助。
  • 不,这不是一组确切的步骤 - “结帐”并没有告诉我们您做了什么。理想情况下,从命令行执行此操作比在 IDE 中更清晰。
  • 同样从命令行显示git status的结果。
  • 你能给我们git reflog中相关的行吗?
  • 当我使用命令行,试图重现问题时,我失败了,因为它有效!所以我想可能是 IntelliJ IDEA 的 BUG。稍后我将向您展示 IntelliJ IDEA 中的 reflog。谢谢。

标签: git intellij-idea git-detached-head


【解决方案1】:

问题及解决办法

仔细检查 IntelliJ-IDEA 日志可以发现问题的本质。创建前两个提交后,您处于以下情况:

不知何故,您签出了您的第一个提交,这使您处于 detached-HEAD 状态:

然后,类似地,您检查了您的第二次提交(恰好是您的 master 分支的提示)。这仍然让你处于 detached-HEAD 状态:


你写:

我从master [...] 签出了一个提交/分支

小心。签出恰好是分支尖端的提交等同于签出该分支!


请注意,HEAD 现在直接指向提交,不是指向分支。这就是“分离的 HEAD”的定义。 HEAD 指向与 master 相同的提交这一事实并没有改变您的 HEAD 已分离这一事实。


某些 IDE 可能不会明确指示您实际上处于 detached-HEAD 状态。 Even git log --decorate, for a long time, gave you no clue as to whether HEAD was pointing to master, or detached and pointing directly at master's tip.


然后您进行了第三次提交,正如预期的那样,仍然给您留下了一个分离的 HEAD;你的 master 分支仍然指向第二次提交。

要脱离分离的 HEAD 状态,您需要将 HEAD 重新附加到分支(此处为 master)。如何取决于你想做什么。在下文中,我假设您可以访问 Git CLI:

  • 如果您想放弃第三次提交,只需运行

    git checkout master
    

    你最终会回到这种情况:

  • 如果您想保留第三次提交并让master 指向它,请运行

    git branch -f master HEAD
    

    然后

     git checkout master
    

离别提示

在 IDE 中学习 Git 是灾难的秘诀。我建议您首先在命令行建立您的理解,然后才从 GUI 中开始使用 Git,如果您认为这样做会改善您的工作流程。

【讨论】:

  • “小心。签出恰好是分支尖端的提交并不等同于签出该分支!” ... 为我 60 岁的大脑提供了一个真正清晰的时刻!我只是在学习,但不得不说我发现 intellij UI 很有帮助,因为在通过 CLI 进行了几次尝试之后,我至少已经开始使用 Git。总是对复杂性与您作为独立开发者看到的最低回报感到困惑。
【解决方案2】:

要恢复分离的 HEAD,您可以:

git checkout master

【讨论】:

  • 这不会修复当前分支
【解决方案3】:

我在使用 IntelliJ 2020.2 开发 Java Spring 项目时不小心遇到了 detached-HEAD。这就是我恢复正常的方式。

在 git 工具窗口 [Alt+9] 中,分支“Log: origin/master”,有 3 个标签: 黄色 = HEAD,绿色 = master,紫色 = origin/master:

'HEAD' 和 'origin/master' 应用于最新的提交 'master' 已应用于较早的提交

要脱离 detached-head 并将其重置为所需状态“HEAD & master & origin/master all应用于分支的最新提交”,右键单击“master”节点“远程”列表(位于分支左侧日志下的历史记录)并选择“结帐”

这样在分支的最新提交中恢复了正常状态

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 2023-04-09
    • 2011-06-18
    • 2016-10-15
    • 2019-03-13
    • 2012-01-28
    • 2021-08-30
    • 2011-08-11
    相关资源
    最近更新 更多