git - 我是怎么得到一个分离的 HEAD 的?

标签 git intellij-idea git-detached-head

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

这是我做的:

  1. 创建一个新项目并创建 git 存储库。
  2. git 添加
  3. git 提交
  4. 输入一些单词
  5. git 提交
  6. checkout 之前的提交
  7. checkout 回来

    step7

  8. 输入一些单词

  9. 尝试 promise ;提示有分离头。

    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(+)

最佳答案

问题与解决方案

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

enter image description here

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

enter image description here

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

enter image description here


你写:

I checked out a commit/branch from master [...]

小心点。 checkout 恰好是分支顶端的提交等同于 checkout 该分支!


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


某些 IDE 可能不会明确指示您实际上处于分离 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 分支仍然指向第二个提交。

enter image description here

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

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

    git checkout master
    

    你最终会回到这种情况:

    enter image description here

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

    git branch -f master HEAD
    

    enter image description here

    然后

     git checkout master
    

    enter image description here

离别提示

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

关于git - 我是怎么得到一个分离的 HEAD 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34987957/

相关文章:

Git shell 命令别名给出 "bad config file"错误

java - Android Studio Gradle 同步 : "Unable to load class..."

tomcat - 当我使用 tomcat 插件时,Intellij 在哪里部署我的 war ?

javascript - Idea无法识别日期构造函数(TypeScript)

git - fatal- 'origin' 似乎不是 git 存储库

GitHub:权限被拒绝(公钥)。致命:无法从远程存储库读取

git - 如何修改现有的、未推送的提交消息?

Git子模块分离头状态

git - 处于分离头状态时如何保存更改?