Was passiert mit Git-Commits, die in einem getrennten HEAD-Status erstellt wurden?

137

Das ist, was passiert ist:

Ich habe einen Zweig A. Auf Zweig AI hat eine Reihe von Änderungen vorgenommen. Ich war mit dem Code nicht zufrieden, also habe ich das vorherige Commit in Zweig A überprüft. Dann habe ich eine Reihe weiterer Änderungen vorgenommen und sie in Zweig A festgeschrieben. Jetzt kann ich dieses Commit nirgendwo finden. Habe ich diesen Code verloren?

Mausimo
quelle
Wenn Sie sagen "Ich habe das vorherige Commit in Zweig A ausgecheckt", meinen Sie damit "Ich habe Zweig A auf das vorherige Commit zurückgesetzt"? dh hast du eigentlich git reseteher als git checkout?
CB Bailey
Nein, ich habe die Kasse benutzt. Reflog hat funktioniert.
Mausimo
Wenn Sie die Kasse verwendet haben, befanden Sie sich in einem getrennten Verzeichnis, HEADund Zweig A wäre beim vorherigen Festschreiben geblieben. Welche Befehle haben Sie genau ausgeführt?
CB Bailey
1
Ich habe die SourceTree GIT-Benutzeroberfläche unter OSX Lion verwendet. Ich war in Zweig A und habe das vorherige Festschreiben in Zweig A ausgecheckt. Anschließend habe ich eine Reihe von Codeänderungen vorgenommen und festgeschrieben (Zweig A). Ich glaube, ich hatte einen abgetrennten KOPF.
Mausimo
OK, ich glaube, ich war verwirrt, als Sie sagten, dass Sie in Zweig A eine Reihe weiterer Änderungen vorgenommen haben .
CB Bailey

Antworten:

185

Das alte Commit befindet sich noch im Reflog.

git reflog

Daraufhin wird eine Liste der Commits angezeigt, und das "verlorene" Commit sollte sich dort befinden. Sie können es in einen neuen Zweig machen. Wenn der SHA-1 beispielsweise ba5a739 ist, können Sie beim alten Commit einen neuen Zweig mit dem Namen "new-branch" erstellen mit:

git branch new-branch ba5a739

Beachten Sie, dass "verlorene" Commits gelöscht werden, wenn die Datenbank bereinigt wird.

Dietrich Epp
quelle
3
Ich tat das Gleiche und hatte einen Herzinfarkt, weil ich dachte, er sei verloren. Danke für die Information!
Chase
14
Verwenden Sie git cherry-pick [SHA], um das Commit auf einen vorhandenen Zweig zu verschieben, falls Sie versehentlich ein Commit durchgeführt haben, während Sie sich im Status eines getrennten Kopfes befinden
Jan Aagaard Meier
3
Alternativ können Sie zu einem vorhandenen Zweig wechseln und "git merge HEAD @ {n}" n ausführen, was dem im Reflog aufgeführten "verlorenen" Commit entspricht.
eaykin
Wissen Sie, ob das pruneauch getrennte Commits löschen würde, auf die in Commit-Nachrichten verwiesen wird? Oder macht das sie erreichbar ?
Kamafeather
@ Kamafeather: Ich denke nicht, dass sie dadurch erreichbar sind.
Dietrich Epp
63

Wie bereits erwähnt, sind Ihre Commits weiterhin im Reflog verfügbar. Zusätzlich zu den anderen Antworten haben Sie folgende Möglichkeiten, die getrennten HEAD-Commits direkt in Ihren aktuellen Zweig zu übernehmen , ohne einen neuen Zweig zu erstellen und zusammenzuführen:

  1. Schlagen Sie die SHA-1-Hashes der Commits nach, mit denen Sie im getrennten HEAD-Status ausgeführt haben

    git reflog
    
  2. Führen Sie dann alle Commit-Hashes aus, die vom ältesten zum neuesten sortiert sind:

    git cherry-pick <hash1> <hash2> <hash3> ...
    

    Zum Beispiel, wenn ich nur eines hätte, das im kurzen Hash-Format "erste 7 Zeichen" angegeben ist:

    git cherry-pick a21d053
    

Dadurch werden neue Commits für Ihren aktuellen Zweig erstellt, ein Commit pro getrenntem HEAD-Commit-Hash, den Sie im Befehl erwähnen. Es übernimmt auch die ursprünglichen Festschreibungsnachrichten.

Tanius
quelle
11

Mit dem folgenden Befehl können Sie verlorene (baumelnde) Commits finden:

git fsck --lost-found

Beachten Sie, dass Ihr aktueller Kopf, wenn er festschreibt, nicht als verloren aufgeführt wird.

Weitere Informationen finden Sie unter git-fsck (1) Manual Page

Dann können Sie einen Zweig für dieses verlorene Commit erstellen:

git branch new-branch ba5a739
sergtk
quelle
Ich habe zuerst den Befehl "git reflog" und dann "git branch new-branch ba5a739" für ein Submodul verwendet, es hat funktioniert.
Ondermerol
7

Die Git-Sprache für den Status Ihres Arbeitsverzeichnisses ist ein " losgelöster HEAD ". Hier ist ein weiterer Ort, an git reflogdem gespart wird.

$ git reflog
0b40dd6 HEAD@{0}: commit: my commit on detached HEAD
...

Wenn ich versuche, einen anderen Zweig auszuchecken, gibt git-1.7.5.1 einen hilfreichen Vorschlag.

$ git checkout master
Warnung: Sie lassen 1 Commit zurück, nicht verbunden mit
eine Ihrer Niederlassungen:

  0b40dd6 mein Commit auf losgelöstem HEAD

Wenn Sie sie behalten möchten, indem Sie einen neuen Zweig erstellen, ist dies möglicherweise ein guter Zeitpunkt
dazu:

 Git-Zweig new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b

Auf Zweig 'Master' umgeschaltet
Greg Bacon
quelle
Danke für die Infos und den Link. Der Link half mir zu verstehen, was los war.
Mausimo
6

Sie haben es nicht verloren, Git behält immer noch eine Kopie (aber es ist derzeit für keinen Zweigkopf erreichbar). Sie können Ihr fehlendes Commit mit dem git reflogBefehl finden. Das Reflog verfolgt die historischen Positionen eines Zweigkopfs, und Sie können es verwenden, um Dinge zu finden, auf die der Zweigkopf zuvor gezeigt hat.

Greg Hewgill
quelle
4

Befolgen Sie diese Schritte, um Ihren abgetrennten Kopf wieder mit Git Repo zu verbinden

  1. git checkout "your branch with path but without remote name"

zB wenn der entfernte Name der Ursprung ist und der Name des Zweigs bugfix/somebranchverwendet wirdgit checkout bugfix/somebranch

  1. git reflog Rufen Sie die Commit-SHAs aus Ihrer Commit-Liste des getrennten Zweigs auf.

  2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  3. git push

ALLES BEREIT!!

user1520615
quelle
2

In Sourcetree habe ich festgestellt, dass das Git-Reflog nicht funktioniert, also habe ich über die GUI herausgefunden, wie das geht.

Versuchen Sie zunächst, das "verlorene" Commit zu finden, indem Sie im Befehlsverlauf nach einer Nachricht suchen (Ansicht: Befehlsausgabe anzeigen). Es befindet sich hoffentlich im Befehl "Switching Branch" nach dem Commit, den Sie verloren haben, und Sie sehen den Commit-Kommentar mit einer Commit-ID von 1234567.

Nehmen Sie diese Commit-ID mit dem nächsten Schritt.

Klicken Sie auf die Schaltfläche "Verzweigen" in der oberen Symbolleiste und Sie sollten ein Dialogfeld "Neuer Zweig" erhalten, in dem Sie ein bestimmtes Commit angeben können. Geben Sie diese Commit-ID dort ein, geben Sie einen neuen Zweigstellennamen an, klicken Sie auf Zweig erstellen und Sie sollten einen neuen Zweig mit Ihrem verlorenen Commit erhalten!

Dies brachte mir verlorene Arbeit zurück!

blalond
quelle