我怎么最终得到一个独立的HEAD?

guo*_*guo 7 git intellij-idea git-detached-head

我从master检查了一个提交/分支,然后检查回master并写了一些东西.在那之后,我承诺了,但我最终得到了一个独立的HEAD.为什么?

这是我做的:

  1. 创建一个新项目并创建git存储库.
  2. git add
  3. git commit
  4. 输入一些单词
  5. git commit
  6. 结帐到之前的提交
  7. 退房回来

    STEP7

  8. 输入一些单词

  9. 尝试提交; 它提示有一个独立的头.

    STEP9

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(+)
Run Code Online (Sandbox Code Playgroud)

jub*_*0bs 14

问题和解决方案

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

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述


你写:

我从master[...] 检查了一个提交/分支

小心.检查恰好是分支的提示的提交并不等同于检出该分支!


请注意,HEAD现在直接指向提交,而不是指向分支.这就是"分离的HEAD"的定义.这一事实HEAD指向同一个commit的master变化一无所知的事实,你的头分离.


某些IDE可能无法清楚地表明您实际上处于分离-HEAD状态.甚至git log --decorate,很长一段时间,也没有告诉你是否HEAD指向master,或分离并直接指向master尖端.


然后你做了第三次提交,正如预期的那样,仍然留给你一个独立的HEAD; 你的master分支仍指向第二次提交.

在此输入图像描述

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

分手小费

在IDE中学习Git是一种灾难.您应该首先在命令行中建立您的理解,然后才开始在GUI中使用Git,如果您认为这样做会改善您的工作流程.

  • “小心。检查恰好是分支尖端的提交并不等于检查该分支!” ...为我 60 岁的大脑带来了真正的清晰时刻!我只是在学习,但不得不说,我发现 intellij UI 很有帮助,因为在多次尝试通过 CLI 进行操作后,我至少已经开始使用 Git。作为独立开发者,总是对复杂性与最小回报感到困惑。 (2认同)