it-swarm.com.de

Reparieren Sie einen abgetrennten Git-Kopf?

Ich habe einige Arbeit in meinem Repository gemacht und festgestellt, dass eine Datei lokale Änderungen aufweist. Ich wollte sie nicht mehr, deshalb löschte ich die Datei und dachte, ich könnte nur eine frische Kopie auschecken. Ich wollte das Git-Äquivalent von machen

svn up .

Die Verwendung von git pull schien nicht zu funktionieren. Eine zufällige Suche führte mich zu einer Website, auf der jemand empfahl, zu tun

git checkout HEAD^ src/

(src ist das Verzeichnis, in dem sich die gelöschte Datei befindet).

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

1126
Daniel

Freistehender Kopf bedeutet, dass Sie sich nicht mehr in einem Zweig befinden, Sie haben ein einzelnes Commit im Verlauf ausgecheckt (in diesem Fall das Commit vor HEAD, d. H. HEAD ^).

Wenn Sie löschen Ihre mit dem freistehenden HEAD verbundenen Änderungen

Sie müssen nur den Zweig, in dem Sie sich befanden, auschecken, 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, sondern tun Sie es

git checkout -- path/to/foo

Dadurch wird die Datei foo in dem Zustand wiederhergestellt, in dem sie sich im Index befindet. 

Wenn Sie behalten möchten Ihre Änderungen, die mit dem abgetrennten HEAD verbunden sind

  1. git log -n 1 ausführen; Dadurch wird das letzte Commit auf dem abgelösten HEAD angezeigt. Kopieren Sie den Commit-Hash und fügen Sie ihn ein.
  2. git checkout master ausführen
  3. Führen Sie git branch tmp <commit-hash> aus. Dadurch werden Ihre Änderungen in einem neuen Zweig mit dem Namen tmp gespeichert.
  4. Wenn Sie die von Ihnen vorgenommenen Änderungen in master übernehmen möchten, führen Sie git merge tmp im Zweig master aus. Nach dem Ausführen von git checkout master sollten Sie sich im Zweig master befinden.
1647
ralphtheninja

Wenn Sie Dateien geändert haben, die Sie nicht verlieren möchten, können Sie sie pushen. Ich habe sie im freistehenden Modus festgelegt und danach können Sie zu einem temporären Zweig wechseln, um ihn 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 ist mit Commit in einem freistehenden Kopf zu tun

410
Toni Gamez

Eine Lösung, ohne einen temporären Zweig anzulegen.

Beenden ("fix") detached HEAD state wenn Sie in diesem Modus bereits etwas geändert haben und möchten Ihre Änderungen optional speichern:

  1. Bestätigen Sie die Änderungen, die Sie behalten möchten. Wenn Sie die Änderungen übernehmen möchten, die Sie im Zustand detached HEAD vorgenommen haben, bestätigen Sie diese. Mögen:

    git commit -a -m "your commit message"
    
  2. Verwerfen Sie Änderungen, die Sie nicht behalten möchten. Der Hard Reset löscht alle nicht festgeschriebenen Änderungen, die Sie in detached vorgenommen haben HEAD state:

    git reset --hard
    

    (Ohne dies würde Schritt 3 fehlschlagen und sich über geänderte, nicht festgeschriebene Dateien im abgelösten HEAD beschweren.)

  3. Überprüfen Sie Ihre Filiale. Exit detached HEAD Status, indem Sie den Zweig, an dem Sie zuvor gearbeitet haben, auschecken, zum Beispiel:

    git checkout master
    
  4. Übernimm deine Commits. Sie können jetzt die Commits übernehmen, die Sie in detached HEAD state durch Kirschpicking gemacht haben, wie in meine Antwort auf eine andere Frage gezeigt.

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

Freistehender Kopf bedeutet:

  1. Sie sind nicht mehr in einer Filiale,
  2. Sie haben ein einzelnes Commit in der Historie ausgecheckt

Wenn Sie keine Änderungen vorgenommen haben: können Sie mit dem folgenden Befehl zum Master wechseln

  git checkout master

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

Im Falle eines freistehenden HEAD funktionieren Commits wie normal, außer dass kein benannter Zweig aktualisiert wird. Um den Master-Zweig mit Ihren festgeschriebenen Änderungen auf den neuesten Stand zu bringen, erstellen Sie einen temporären Zweig, in dem Sie sich befinden (auf diese Weise werden alle festgeschriebenen Änderungen, die Sie im abgelösten HEAD vorgenommen haben), wechseln Sie zum Master-Zweig und führen Sie den temporären Zweig mit dem zusammen der Meister.

git branch  temp
git checkout master
git merge temp
108
Razan Paul

Hier ist, was ich gerade tat, nachdem ich gemerkt hatte, dass ich einen abgehobenen Kopf hatte und bereits einige Änderungen vorgenommen hatte.

Ich habe die Änderungen übernommen.

$ 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 die Branche angewendet.

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

Ich denke, das ist etwas einfacher als das Erstellen eines temporären Zweigs.

52
Philippe Gerber

Wenn Sie einige Änderungen vorgenommen haben und dann festgestellt haben, dass Sie sich auf einem abgetrennten Kopf befinden, 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 uneingeschränkten Änderungen und normalen "angehängten" KOPF haben, als ob nichts passiert wäre.

41
mojuba

Wenn Sie ein bestimmtes Commit in git auschecken, landen Sie im detached head -Zustand ... dh Ihre Arbeitskopie spiegelt nicht mehr den Status einer benannten Referenz (wie "master") wider. Dies ist hilfreich, wenn Sie den früheren Status des Repositorys untersuchen möchten, aber nicht, was Sie möchten, wenn Sie tatsächlich Änderungen rückgängig machen möchten.

Wenn Sie Änderungen an einer bestimmten Datei vorgenommen haben und diese einfach verwerfen möchten, können Sie den Befehl checkout folgendermaßen verwenden:

git checkout myfile

Dadurch werden alle nicht festgeschriebenen Änderungen verworfen und die Datei in den Status zurückgesetzt, den sie im Kopf Ihres aktuellen Zweigs hat. Wenn Sie bereits vorgenommene Änderungen verwerfen möchten, können Sie den Befehl reset verwenden. Dadurch wird das Repository beispielsweise auf den Status des vorherigen Commits zurückgesetzt, und alle nachfolgenden Änderungen werden verworfen:

git reset --hard HEAD^

Wenn Sie das Repository jedoch für andere Personen freigeben, kann ein git reset störend sein (da ein Teil des Repository-Verlaufs gelöscht wird). Wenn Sie Änderungen bereits mit anderen Personen geteilt haben, möchten Sie im Allgemeinen stattdessen git revert anzeigen, wodurch ein "Antikommit" generiert wird. Dies bedeutet, dass ein neuer Commit erstellt wird, der die betreffenden Änderungen "rückgängig macht".

Das Git Book hat mehr Details.

40
larsks

Da sich der Status "Freistehender Kopf" auf einem temporären Zweig befindet, verwenden Sie einfach git checkout -, wodurch Sie sich auf den letzten Zweig befinden, in dem Sie sich befanden.

17
Mike

Nachtrag

Wenn der Zweig, zu dem Sie zurückkehren möchten, die letzte von Ihnen vorgenommene Kasse war, können Sie einfach checkout @{-1} verwenden. Dies bringt Sie zu Ihrer vorherigen Kasse zurück. 

Außerdem können Sie diesen Befehl beispielsweise mit git global --config alias.prev als Aliasnamen angeben, sodass Sie lediglich git prev eingeben müssen, um zur vorherigen Kasse zurückzukehren.

5
David Brower

Um die Antwort von @Philippe Gerber weiter zu verdeutlichen, hier:

 git cherry-pick

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

5
Timo

In meinem Fall starte ich git status und sah, dass sich in meinem Arbeitsverzeichnis einige unaufgezogene Dateien befanden.

Ich musste sie nur reinigen (da ich sie nicht brauchte), um die Rebase auszuführen, die ich ausführen wollte.

0
falsarella

Git hat mir gesagt, wie es geht.

wenn Sie eingegeben haben: 

git checkout <some-commit_number>

Speichern Sie den Status

git add .
git commit -m "some message"

Dann:

 git Push Origin HEAD:<name-of-remote-branch>
0
Sterling Diaz

In "Detached Head" bedeutet, dass HEAD auf ein bestimmtes unbenanntes Commit verweist (im Gegensatz zu einem benannten Zweig) (cf: https://git-scm.com/docs/git-checkout section Freistehender Kopf)

Um das Problem zu beheben, müssen Sie nur den zuvor ausgewählten Zweig auswählen 

git checkout @{-1}

0
Pat. ANDRIA

Ich wollte meine Änderungen so beibehalten, ich habe das Problem einfach behoben ...

git add .
git commit -m "Title" -m "Description"
(so i have a commit now example: 123abc)
git checkout YOURCURRENTBRANCH
git merge 123abc
git Push TOYOURCURRENTBRANCH

diese Arbeit für mich

0
CRLZXO

Wenn Sie sich in einer Situation ohne Kopf befinden und neue Dateien erstellt haben, stellen Sie zunächst sicher, dass diese neuen Dateien zum Index hinzugefügt werden. Beispiel:

git add .

Wenn Sie jedoch nur vorhandene Dateien geändert oder gelöscht haben, können Sie sie gleichzeitig hinzufügen (-a) und mit einer Nachricht bestätigen (-m):

git commit -a -m "my adjustment message"

Dann können Sie einfach eine neue Filiale mit Ihrem aktuellen Status erstellen mit:

git checkout -b new_branch_name

Sie werden einen neuen Zweig haben und alle Ihre Anpassungen werden dort in diesem neuen Zweig sein. Sie können dann weiter auf die Fernbedienung drücken und/oder nach Belieben auschecken/ziehen/zusammenführen.

0
DZet
git pull Origin master

arbeitete für mich Es ging nur darum, Remote- und Branchennamen explizit anzugeben.

0
Amjedonline