Gelöschten Stash in Git mit SourceTree abrufen

Lesezeit: 5 Minuten

Benutzer-Avatar
Tusharmath

Ich verwende Quellbaum. Ich hatte einen Stapel mit mehreren Änderungen erstellt und versehentlich gelöscht. Gibt es eine Möglichkeit, sie wieder abzurufen?

  • Möglicherweise verwandt: Gelöschten Stash in Git wiederherstellen.

    Benutzer456814

    5. Mai 2014 um 4:15 Uhr

Benutzer-Avatar
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

Benutzer-Avatar
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.

  1. git fsck --lost-found

  2. ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline

  3. git stash apply [tag]

Geben Sie hier die Bildbeschreibung ein

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]

Benutzer-Avatar
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).

Benutzer-Avatar
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

1308350cookie-checkGelöschten Stash in Git mit SourceTree abrufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy