12

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

这是我所做的:

  1. 创建一个新项目并创建 git 存储库。
  2. 混帐添加
  3. git 提交
  4. 打几个字
  5. git 提交
  6. 签出到先前的提交
  7. 结帐回来

    第七步

  8. 输入一些单词

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

    步骤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(+)
4

3 回答 3

24

问题与解决方案

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

在此处输入图像描述

不知何故,您检查了您的第一次提交,这使您处于 detached-HEAD 状态:

在此处输入图像描述

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

在此处输入图像描述


你写:

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

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


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


某些 IDE 可能不会明确指示您实际上处于 detached-HEAD 状态。甚至git log --decorate,在很长一段时间里,你都不知道HEAD是指着master,还是脱离了,直接指向了master尖端


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

在此处输入图像描述

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

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

    git checkout master
    

    你最终会回到这种情况:

    在此处输入图像描述

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

    git branch -f master HEAD
    

    在此处输入图像描述

    接着

     git checkout master
    

    在此处输入图像描述

离别提示

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

于 2016-01-25T13:46:30.183 回答
1

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

git checkout master
于 2016-01-25T08:49:26.837 回答
0

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

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

'HEAD' 和 'origin/master' 应用于最新的提交 在此处输入图像描述 'master' 应用于较早的提交在此处输入图像描述

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

这样在分支的最新提交中恢复了正常状态 在此处输入图像描述

于 2021-04-23T14:27:08.827 回答