Frage Wie bin ich zu einem abgetrennten HEAD gekommen?


Ich überprüfte einen Commit / Zweig vom Master und ging dann zum Master zurück und schrieb etwas. Danach habe ich es begangen, aber ich endete mit einem abgetrennten Kopf. Warum?

Hier ist, was ich getan habe:

  1. Erstellen Sie ein neues Projekt und erstellen Sie ein Git-Repository.
  2. Git hinzufügen
  3. git commit
  4. Tippe ein paar Wörter ein
  5. git commit
  6. Auschecken zum vorherigen Commit
  7. Kasse zurück

    step7

  8. Tippe ein Wort ein

  9. versuch dich zu verpflichten; es fordert einen abgetrennten Kopf auf.

    step9

IntelliJ IDEAs Konsole zeigt:

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

5
2018-01-25 08:22


Ursprung


Antworten:


Problem und Lösung

Eine genaue Überprüfung des IntelliJ-IDEA-Protokolls zeigt die Art des Problems. Nachdem Sie Ihre ersten beiden Commits erstellt hatten, befanden Sie sich in der folgenden Situation:

enter image description here

Irgendwie hast du dein erstes Commit ausgecheckt, was dich in den Status "detached-HEAD" versetzt hat:

enter image description here

Dann hast du deinen zweiten Commit ausgecheckt (was übrigens die Spitze deines master Ast). Dies hat dich immer noch in den Zustand losgelöst-HEAD versetzt:

enter image description here


Du schreibst:

Ich überprüfte einen Commit / Zweig von master [...]

Achtung. Ein Commit auszuprobieren, das zufällig die Spitze eines Zweiges ist, ist nicht entspricht dem Auschecken dieser Branche!


Beachten Sie, dass HEAD zeigt jetzt direkt auf ein Commit, nicht zu einer Filiale. Das ist die Definition von "losgelöstem Kopf". Die Tatsache, dass HEAD verweist auf denselben Commit wie master ändert nichts an der Tatsache, dass dein HEAD gelöst ist.


Einige IDEs geben möglicherweise keinen eindeutigen Hinweis darauf, dass Sie sich tatsächlich im Status "Abgelöst-HEAD" befinden. Sogar git log --decorate, hat lange keine Ahnung gegeben, ob HEAD zeigte auf masteroder losgelöst und direkt auf zeigen masterTipp.


Du hast dann ein drittes Commit gemacht, was dich erwartungsgemäß immer noch mit einem abgetrennten HEAD verließ; Ihre master Der Zweig zeigt immer noch auf das zweite Commit.

enter image description here

Um den gelöschten HEAD-Zustand zu verlassen, müssen Sie sich erneut verbinden HEAD zu einer Niederlassung (master, Hier). Wie hängt es ab, was Sie tun möchten. Im Folgenden gehe ich davon aus, dass Sie Zugriff auf die Git CLI haben:

  • Wenn Sie Ihr drittes Commit verwerfen möchten, starten Sie einfach

    git checkout master
    

    und du wirst wieder in dieser Situation enden:

    enter image description here

  • Wenn du dein drittes commit und make machen willst master zeig darauf, renn

    git branch -f master HEAD
    

    enter image description here

    und dann

     git checkout master
    

    enter image description here

Trennspitze

Git in einer IDE zu lernen ist ein Rezept für eine Katastrophe. Sie sollten Ihr Verständnis zuerst in der Befehlszeile aufbauen und erst dann Git innerhalb einer GUI verwenden, wenn Sie glauben, dass dies Ihren Workflow verbessern würde.


7
2018-01-25 13:46



Um einen gelösten HEAD wiederherzustellen, können Sie:

git checkout master

0
2018-01-25 08:49