Ich verwende Quellbaum. Ich hatte einen Stapel mit mehreren Änderungen erstellt und versehentlich gelöscht. Gibt es eine Möglichkeit, sie wieder abzurufen?
Gelöschten Stash in Git mit SourceTree abrufen
Tusharmath
Ischak
Basierend auf früheren Antworten ist hier eine einfache Sequenz:
Öffnen Sie ein Terminalfenster und cd in einen Ordner unter dem Repository. Dann:
git fsck | awk '{print $3}' > tmp.txt
cat tmp.txt | xargs git show > tmp2.txt
Jetzt offen tmp2.txt Suchen Sie im Editor Ihren verlorenen Code und finden Sie die Commit-ID oben drauf. Dann den Code anwenden:
git stash apply <commit id>
rm tmp.txt tmp2.txt
Das hat mir das Leben gerettet! Ich danke wirklich allen, die diese Frage beantwortet haben. Ich segne den Git-Schöpfer Linus Torvalds um gelöschte Sachen in der Git-Datenbank zu behalten. Genius!!
BEARBEITEN 2021: Beachten Sie, dass Windows-Benutzer dasselbe mit tun können GitBash.
Der Stash wird intern als Merge-Commit gespeichert, auf den von einer Liste von Stashes verwiesen wird.
git fsck
kann baumelnde Gegenstände finden. Es wird nicht nur Ihren gelöschten Stash finden, sondern wahrscheinlich auch andere Dinge … Sie sollten also nach Commits suchen, die so aussehen, als könnten sie Ihr Stash sein (git show <ID>
um relevante Informationen zu einem Objekt anzuzeigen und zu entscheiden, ob es das gesuchte ist).
Sobald Sie das haben, müssen Sie es nur noch in die Liste der Stashes einfügen. Die Liste ist gespeichert in .git/logs/refs/stash
und eine Zeile hat folgendes Format:
<ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> <ID of merge commit> Your Name <[email protected]> <UNIX timestamp> <time zone, e.g. +0000><TAB char><description of stash>
Hier ist ein funktionierendes Beispiel:
16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <email.censored@invalid> 1374227992 +0200 WIP on master: 0dbd812 Update draft release notes to 1.8.4
Synthetisieren Sie einfach eine Zeile für den Stash, den Sie wieder einfügen möchten (Name/Mail/Zeitstempel/Beschreibung nicht haben um genau zu sein) und Sie sollten es wieder normal verwenden können.
Fröhliches Jagen!
-
Ich lief die
git fsck
Befehl und es gab mir ungefähr 100 Guides. Gibt es eine einfachere Möglichkeit, dies zu umgehen? Ich meine etwas Visuelleres?– Tusharmath
19. Juli 2013 um 10:10 Uhr
-
Es ist unmöglich, durch 100 Anleitungen zu gehen! Bitte schlagen Sie einen einfacheren Weg vor.
– Tusharmath
19. Juli 2013 um 10:25 Uhr
-
Das ist der einzige Weg, den ich kenne. Sie können es jedoch wahrscheinlich ziemlich reduzieren, indem Sie Folgendes verwenden:
git fsck --unreachable
; und um direkt eine Liste mit Details zu erhalten, vielleicht so etwas:for i in $(git fsck --unreachable --no-dangling 2>|/dev/null | grep commit | cut -d' ' -f3); do git --no-pager log -1 $i; done | less
– Jan Krüger
19. Juli 2013 um 10:46 Uhr
-
Ich denke, dass die sha-1 ausreicht. Ruf einfach an
git sash apply
.– Micha Wiedenmann
19. Juli 2013 um 12:10 Uhr
-
@JanKrüger nicht
stash
Mappe– Franz
14. Juni um 10:20 Uhr
qqx
Wie die vorherigen Antwortzustände können Sie verwenden git fsck
um Objekte aufzulisten, die von nichts referenziert werden, was Ihren gelöschten Stash enthalten würde. Aber es ist möglich zu verwenden git show
um diese Liste von Objekten zu filtern, um nur solche Verstecke anzuzeigen:
git fsck 2> /dev/null |
awk '/commit/{print $3}' |
git show --stdin --merges --grep '^WIP on'
Wenn Sie wissen, wann der Stash erstellt wurde, können Sie auch ein Argument wie hinzufügen
--since '2 days ago'
bis zur letzten Zeile, um die Ausgabe weiter einzuschränken. Hoffentlich wird das die Liste auf eine überschaubare Größe reduzieren.
Sobald Sie den richtigen Stash gefunden haben, notieren Sie sich seine Commit-ID, und Sie können ihn verwenden
git stash apply COMMITID
um es so anzuwenden, als ob es nicht gelöscht worden wäre.
Dies ist die sauberste Problemumgehung, um gelöschten Stash wiederherzustellen.
-
git fsck --lost-found
-
ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline
-
git stash apply [tag]
Ersetzen [tag] mit der id, zb:
git stash anwenden 40e47250d0b4fb6143be67c115b708be126e79d3
Es kann hilfreich sein, beim Verstauen Kommentare zu verwenden, indem Sie Folgendes verwenden:
git stash save "comment"
Es hat mir einige Probleme erspart, bereits gelöschten Stash zu finden, indem ich Folgendes verwende:
git fsck --lost-found
ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline
git stash apply [tag]
Roddy T.
Wie Jan Krüger oben feststellt, git fsck
ist der Weg zu gehen. Wenn Sie jedoch (aus welchen Gründen auch immer) nicht in der Lage sind, eine Zeile in Ihrer Stash-Datei erfolgreich zu synthetisieren und den Stash in der verfügbaren Liste erscheinen zu lassen, können Sie verwenden git stash apply <guid>
direkt, ohne die Zeile hinzuzufügen. Dadurch werden die Datei(en)änderungen sofort auf Ihren aktuellen Zweig angewendet (nicht festgeschrieben).
Amarnath
Eine andere Lösung ist:
git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log
Finden Sie den Autor und geben Sie Informationen ein (Datum, Hash, Autor usw.)
git stash store <hash-id-of-specific-commit>
-
Ich habe ein paar Skripte ausprobiert, aber dieses funktionierte ohne Fehler oder gab mir zufällige/n Daten.
– Daniel Ryan
20. Juli 2017 um 2:07 Uhr
Möglicherweise verwandt: Gelöschten Stash in Git wiederherstellen.
– Benutzer456814
5. Mai 2014 um 4:15 Uhr