Frage Fix einen Git abgelösten Kopf?


Ich habe in meinem Repository gearbeitet und festgestellt, dass eine Datei lokale Änderungen aufweist. Ich wollte sie nicht mehr, also löschte ich die Datei und dachte, ich könnte einfach eine neue Kopie auschecken. Ich wollte das git-Äquivalent machen

svn up .

Verwenden git pull schien nicht zu funktionieren. Irgendeine zufällige Suche führte mich zu einer Seite, wo jemand empfohlen hat

git checkout HEAD^ src/

(src ist das Verzeichnis, das die gelöschte Datei enthält).

Jetzt finde ich heraus, dass ich einen abgetrennten Kopf habe. Ich habe keine Ahnung, was das ist. Wie kann ich rückgängig machen?


982
2018-04-19 13:07


Ursprung


Antworten:


Losgelöster Kopf bedeutet, dass Sie sich nicht mehr auf einem Zweig befinden, Sie haben einen einzelnen Commit in der Historie ausgecheckt (in diesem Fall das Commit vor HEAD, d. H. HEAD ^).

Wenn du möchtest löschen Ihre Änderungen sind mit dem losgelösten HEAD verbunden

Sie müssen nur die Filiale auschecken, in der Sie sich befanden, z.

git checkout master

Wenn Sie das nächste Mal eine Datei geändert haben und sie in den Zustand zurückversetzen möchten, in dem sie sich im Index befindet, löschen Sie die Datei nicht zuerst, tun Sie es einfach

git checkout -- path/to/foo

Dadurch wird die Datei foo auf den Status im Index zurückgesetzt.

Wenn du möchtest behalten Ihre Änderungen sind mit dem losgelösten HEAD verbunden

  1. Lauf git log -n 1; Dies zeigt das letzte Commit auf dem abgetrennten HEAD an. Kopieren Sie den Commit-Hash und fügen Sie ihn ein.
  2. Lauf git checkout master
  3. Lauf git branch tmp <commit-hash>. Dies speichert Ihre Änderungen in einem neuen Zweig namens tmp.
  4. Wenn Sie die Änderungen, die Sie vorgenommen haben, einbeziehen möchten master, Lauf git merge tmp von dem master Ast. Du solltest auf dem sein master nach dem Laufen verzweigen git checkout master.

1406
2018-04-19 13:32



Wenn Sie Dateien geändert haben, die Sie nicht verlieren möchten, können Sie sie verschieben. Ich habe sie im losgelösten Modus begangen und danach können Sie in einen temporären Zweig wechseln, um später in Master zu integrieren.

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

Extrahiert aus:

Was zu tun mit dem Commit gemacht in einem distanzierten Kopf


368
2017-12-09 20:05



Wie man den abgekoppelten HEAD-Zustand beendet ("repariert") wenn Sie in diesem Modus bereits etwas geändert haben und, optional, möchten Sie Ihre Änderungen speichern.

Diese Lösung funktioniert, ohne eine temporäre Verzweigung zu erstellen.

  1. Änderungen übernehmen, die Sie behalten möchten. Wenn Sie Änderungen übernehmen möchten, die Sie im Status "Einzelner HEAD" vorgenommen haben, übernehmen Sie sie. Mögen:

    git commit -a -m "your commit message"
    
  2. Verwerfen Sie Änderungen, die Sie nicht behalten möchten. Durch das Hard-Reset werden alle nicht festgeschriebenen Änderungen, die Sie im abgekoppelten HEAD-Zustand vorgenommen haben, verworfen:

    git reset --hard
    

    (Ohne dies würde Schritt 3 fehlschlagen und sich über modifizierte nicht festgeschriebene Dateien im abgetrennten HEAD beschweren.)

  3. Schau dir deine Filiale an. Beende den abgekoppelten HEAD-Status, indem du den Zweig abfragst, an dem du zuvor gearbeitet hast, zum Beispiel:

    git checkout master
    
  4. Übernehmen Sie Ihre Commits. Sie können jetzt die Commits übernehmen, die Sie im losgelösten HEAD-Zustand durch Cherry Picking gemacht haben, wie in meine Antwort auf eine andere Frage.

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> …
    

105
2018-06-11 13:23



Freistehender Kopf bedeutet:  (1) Du bist nicht mehr auf einem Ast,  (2) Sie haben ein einzelnes Commit im Verlauf ausgecheckt

wenn Sie keine Änderungen haben: Sie können zum Master wechseln, indem Sie den folgenden Befehl anwenden

  git checkout master

Wenn Sie Änderungen haben, die Sie behalten möchten: 

Im Fall von losgelöstem HEAD funktionieren die Commits wie normal, außer dass kein benannter Zweig aktualisiert wird. Um den Master-Zweig zu aktualisieren Machen Sie mit Ihren festgeschriebenen Änderungen eine temporäre Verzweigung, wo Sie sind (auf diese Weise wird die temporäre Verzweigung alle festgeschriebenen Änderungen, die Sie in der abgetrennten HEAD vorgenommen haben), wechseln Sie dann in die Master-Verzweigung und fusionieren Sie die temporäre Verzweigung mit dem Master.

git branch  temp
git checkout master
git merge temp

87
2017-08-29 00:39



Hier ist, was ich gerade getan habe, nachdem ich erkannt hatte, dass ich auf einem abgetrennten Kopf war und bereits einige Änderungen vorgenommen hatte.

Ich habe die Änderungen vorgenommen.

$ git commit -m "..."
[detached HEAD 1fe56ad] ...

Ich erinnerte mich an den Hash (1fe56ad) des Commits. Dann überprüfte ich den Zweig, in dem ich hätte sein sollen.

$ git checkout master
Switched to branch 'master'

Schließlich habe ich die Änderungen des Commits auf den Zweig angewendet.

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...

Ich denke, das ist ein bisschen einfacher als eine temporäre Verzweigung zu erstellen.


49
2017-08-02 23:33



Wenn Sie ein bestimmtes Commit in git, du landest in einem abgetrennter Kopf state ... das heißt, Ihre Arbeitskopie gibt nicht mehr den Zustand einer benannten Referenz wieder (wie "master"). Dies ist nützlich, um den letzten Zustand des Repositorys zu untersuchen, aber nicht das, was Sie wollen, wenn Sie tatsächlich versuchen, Änderungen rückgängig zu machen.

Wenn Sie Änderungen an einer bestimmten Datei vorgenommen haben und diese einfach verwerfen möchten, können Sie die checkout Befehl wie folgt:

git checkout myfile

Dadurch werden alle nicht festgeschriebenen Änderungen verworfen und die Datei in den Zustand zurückversetzt, den sie im Kopf der aktuellen Verzweigung hat. Wenn Sie Änderungen, die Sie bereits begangen haben, verwerfen möchten, sollten Sie die Option verwenden reset Befehl. Zum Beispiel wird dadurch das Repository auf den Status des vorherigen Commits zurückgesetzt, wobei alle nachfolgenden Änderungen verworfen werden:

git reset --hard HEAD^

Wenn Sie das Repository jedoch mit anderen Personen teilen, a git reset kann störend sein (weil es einen Teil des Repository-Verlaufs löscht). Wenn Sie bereits Änderungen mit anderen Personen geteilt haben, möchten Sie das im Allgemeinen sehen git revert Stattdessen wird ein "Anti-Commit" generiert, dh es wird ein neues Commit erstellt, das die betreffenden Änderungen "rückgängig macht".

Das Git Buch hat mehr Details.


39
2018-04-19 13:32



Wenn du ein paar Änderungen vorgenommen hast und dann feststellst, dass du auf einem abgetrennten Kopf stehst, gibt es dafür eine einfache Lösung: stash -> checkout master -> stash pop:

git stash
git checkout master   # Fix the detached head state
git stash pop         # ... or for extra safety use 'stash apply' then later 
                      # after fixing everything do 'stash drop'

Sie werden Ihre unbearbeiteten Änderungen und normalen "angehängten" Kopf haben, als wäre nichts passiert.


37
2018-01-01 22:40



Da "disabled head state" dich auf einen temporären Zweig hat, benutze einfach git checkout - was dich auf den letzten Zweig setzt, in dem du warst.


14
2017-11-20 19:30



Nachtrag

Wenn die Filiale, zu der Sie zurückkehren möchten, die letzte Kasse war, die Sie gemacht haben, können Sie einfach verwenden checkout @{-1}. Dies bringt Sie zurück zu Ihrer vorherigen Kasse.

Außerdem können Sie diesen Befehl zum Beispiel mit git global --config alias.prev so dass Sie nur tippen müssen git prev um zum vorherigen Checkout zurückzukehren.


4
2018-01-22 11:09



Um @Philippes Gerbers Antwort weiter zu klären, hier ist es:

git cherry-pick

Vor cherry-pick, ein git checkout master ist in diesem Fall notwendig. Außerdem wird es nur mit einem benötigt commit im detached head.


2
2017-12-06 13:39