Wenn ich renne git branch -d XYZ
Gibt es eine Möglichkeit, den Zweig wiederherzustellen? Gibt es einen Weg zurück zu gehen, als hätte ich den Lösch-Verzweigungsbefehl nicht ausgeführt?
Wenn ich renne git branch -d XYZ
Gibt es eine Möglichkeit, den Zweig wiederherzustellen? Gibt es einen Weg zurück zu gehen, als hätte ich den Lösch-Verzweigungsbefehl nicht ausgeführt?
Ja, du solltest es tun können git reflog
und finde den SHA1 für den Commit an der Spitze deines gelöschten Zweigs, dann einfach git checkout [sha]
. Und wenn du erst einmal bei diesem Commit bist, kannst du es einfach git checkout -b [branchname]
um den Zweig von dort neu zu erstellen.
Die meiste Zeit sind unerreichbare Commits im Reflog. Damit, Das erste, was Sie versuchen sollten, ist den Reflog zu betrachten Verwenden des Befehls git reflog
(die den Reflog für anzeigen HEAD
).
Vielleicht ist es etwas einfacher, wenn der Commit Teil eines bestimmten noch existierenden Zweiges ist, den Befehl zu verwenden git reflog name-of-my-branch
. Es funktioniert auch mit einer Fernbedienung, zum Beispiel wenn Sie gezwungen werden zu drücken.
Wenn Ihre Commits nicht in Ihrem Reflog enthalten sind (vielleicht weil sie von einem Tool eines Drittanbieters gelöscht wurden, das nicht in den Reflog schreibt), habe ich erfolgreich einen Zweig wiederhergestellt, indem ich meinen Zweig mit einem Befehl wie diesem auf den sha des Commits zurückgesetzt habe (er erstellt eine Datei mit allen dangling commits) ):
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
Wenn Sie es mehr als einmal verwenden sollten (oder es irgendwo speichern möchten), könnten Sie auch einen Alias mit diesem Befehl erstellen ...
git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'
und benutze es mit git rescue
Um gefundene Commits zu untersuchen, könnten Sie jedes Commit mit einigen Befehlen anzeigen, um sie zu untersuchen.
Um die Commit-Metadaten anzuzeigen (Autor, Erstellungsdatum und Commit-Nachricht):
git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Um auch die Diffs zu sehen:
git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Sobald Sie Ihr Commit gefunden haben, erstellen Sie einen Zweig für dieses Commit mit:
git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
Wenn Sie eine GUI verwenden möchten, können Sie die gesamte Operation mit gitk ausführen.
gitk --reflog
Auf diese Weise können Sie den Commitverlauf der Verzweigung anzeigen, als wäre die Verzweigung nicht gelöscht worden. Klicken Sie nun einfach mit der rechten Maustaste auf das letzte Commit in der Verzweigung und wählen Sie die Menüoption Create new branch
.
Die Lösung mit der besten Wahl ist tatsächlich mehr als gewünscht:
git checkout <sha>
git checkout -b <branch>
oder
git checkout -b <branch> <sha>
Sie werden zusammen mit allen Änderungen, die Sie möglicherweise vergessen haben, in den neuen Zweig verschoben. Dies ist möglicherweise nicht Ihre Absicht, besonders wenn Sie sich im "Panikmodus" nach dem Verlust der Filiale befinden.
EIN sauberere (und einfachere) Lösung scheint der One-Liner zu sein (nachdem Sie die gefunden haben <sha>
mit git reflog
):
git branch <branch> <sha>
Jetzt sind weder Ihre aktuelle Verzweigung noch Änderungen betroffen. Stattdessen wird nur eine neue Verzweigung bis hin zur <sha>
.
Wenn es nicht der Tipp ist, wird es immer noch funktionieren und Sie erhalten einen kürzeren Zweig, dann können Sie es mit einem neuen versuchen <sha>
und neuer Zweigname, bis Sie es richtig machen.
Abschließend können Sie den erfolgreich wiederhergestellten Zweig umbenennen in was er benannt wurde oder irgendetwas anderes:
git branch -m <restored branch> <final branch>
Unnötig zu sagen, der Schlüssel zum Erfolg war, das richtige Commit zu finden <sha>
, so nenne deine Commits weise :)
Hinzufügen zu tfe Antworten: Da ist auch der git-resurrect.sh Skript in der contrib/
Bereich der Git Quellen (in git.git Repository), die Ihnen helfen könnten.
git-resurrect <name>
Versuche, Spuren einer Verzweigungsspitze zu finden namens<name>
und versucht es wiederzubeleben. Derzeit ist der Reflog Nach Kassennachrichten gesucht und mit-r
auch Nachrichten zusammenführen. Mit-m
und-t
, die Geschichte aller Refs wird gescanntMerge <name> into other
/Merge <other> into <name>
(bzw.) begehen Themen, die ist ziemlich langsam, aber ermöglicht es Ihnen, das Thema anderer Leute wiederzubeleben Geäst.
Wenn Sie kein Reflog haben, z. Da Sie in einem leeren Repository arbeiten, in dem der Reflog nicht aktiviert ist und der Commit, den Sie wiederherstellen möchten, erst kürzlich erstellt wurde, können Sie auch kürzlich erstellte Commit-Objekte suchen und durchsehen.
Aus dem Inneren des .git/objects
Verzeichnislauf:
find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
Dadurch werden alle Objekte (Commits, Dateien, Tags usw.), die in den letzten 12 Stunden erstellt wurden, gefunden und gefiltert, sodass nur Commits angezeigt werden. Diese zu überprüfen ist dann ein schneller Prozess.
Ich würde das git-ressurect.sh-Skript versuchen, das in erwähnt wird Jakubs Antwort zuerst aber.
Ich habe die folgenden Befehle verwendet, um meine gelöschte Verzweigung zu finden und abzurufen. Die ersten Schritte stammen aus der Beschreibung von gcb.
$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\ -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline
Suchen Sie nun nach der Git-Commit-ID (GIT-SHA) basierend auf den Commit-Kommentaren und verwenden Sie sie im folgenden Befehl. Prüfe einen neuen Zweig namens NEW-BRANCH mit dem zuvor gefundenen GIT-SHA:
$ git checkout -b NEW-BRANCH GIT-SHA