Frage Kann ich einen Zweig nach dem Löschen in Git wiederherstellen?


Wenn ich renne git branch -d XYZGibt 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?


765
2017-09-04 03:25


Ursprung


Antworten:


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.


1378
2017-09-04 03:43



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

98
2018-03-10 15:10



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.


30
2018-06-02 14:28



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 :)


15
2018-04-08 15:33



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 gescannt Merge <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.


13
2017-09-06 19:39



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.


8
2018-05-13 11:26



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

6
2017-11-14 13:28