2516 Stimmen

Wie kann man einen verlorenen Stash in Git wiederherstellen?

Ich verwende häufig git stash y git stash pop um Änderungen in meinem Arbeitsbaum zu speichern und wiederherzustellen. Gestern hatte ich einige Änderungen in meinem Arbeitsbaum, die ich zwischengespeichert und wiederhergestellt habe, und dann habe ich weitere Änderungen an meinem Arbeitsbaum vorgenommen. Ich würde gerne zurückgehen und die gestern gespeicherten Änderungen überprüfen, aber git stash pop scheint alle Verweise auf die zugehörige Übertragung zu entfernen.

Ich weiß, dass ich, wenn ich die git stash dann .git/refs/stash enthält die Referenz der Übergabe, die zur Erstellung des Stash verwendet wurde. Und .git/logs/refs/stash enthält den gesamten Vorrat. Aber diese Referenzen sind verschwunden, nachdem git stash pop . Ich weiß, dass der Commit noch irgendwo in meinem Repository ist, aber ich weiß nicht, was er war.

Gibt es eine einfache Möglichkeit, die gestrige Stash-Commit-Referenz wiederherzustellen?

Für mich ist das heute nicht so wichtig, weil ich tägliche Backups habe und auf den Arbeitsbaum von gestern zurückgreifen kann, um meine Änderungen zu erhalten. Ich frage, weil es einen einfacheren Weg geben muss!

24voto

Vivek Kumar Punkte 1829

Sie können alle unerreichbaren Commits auflisten, indem Sie diesen Befehl im Terminal eingeben -

git fsck --unreachable

Unerreichbaren Commit-Hash prüfen -

git show hash

Wenden Sie sich schließlich an, wenn Sie den versteckten Gegenstand finden -

git stash apply hash

20voto

Can Tecim Punkte 537

In OSX mit git v2.6.4, ich gerade git stash Drop zufällig ausgeführt, dann fand ich es, indem Sie durch die folgenden Schritte

Wenn Sie den Namen des Verstecks kennen, verwenden Sie ihn:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show | grep -B 6 -A 2 <name of the stash>

Andernfalls finden Sie die ID aus dem Ergebnis mit manuell:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show

Wenn Sie dann die Commit-id finden, drücken Sie einfach git stash apply {commit-id}

Hoffentlich hilft das jemandem schnell

19voto

RobbyD Punkte 483

Warum stellen die Leute diese Frage? Weil sie das Reflog noch nicht kennen oder verstehen.

Die meisten Antworten auf diese Frage enthalten lange Befehle mit Optionen, die sich kaum jemand merken kann. Die Leute kommen also zu dieser Frage und fügen ein, was sie zu brauchen glauben, und vergessen es fast sofort wieder.

Ich würde jedem, der diese Frage hat, raten, nur das Reflog (git reflog) zu überprüfen, nicht viel mehr als das. Sobald Sie die Liste aller Commits sehen, gibt es hundert Möglichkeiten, herauszufinden, nach welchem Commit Sie suchen, und ihn zu wählen oder einen Zweig davon zu erstellen. Dabei haben Sie das reflog und nützliche Optionen für verschiedene grundlegende Git-Befehle kennengelernt.

1 Stimmen

Hey emragins, ich stimme zu, aber das war genau der Anwendungsfall des Auftraggebers. Ich weiß nicht genau, wie sich die anderen Befehle, die hier gepostet wurden, verhalten würden, aber meine Vermutung wäre, dass sie auch nicht mehr funktionieren würden, sobald der Verweis auf seinen versteckten Commit bereinigt wird.

1 Stimmen

Hmm... das obige Szenario hat mich auf diese Frage gebracht, und ich weiß, dass mindestens ein paar Wochen, wenn nicht sogar fast ein Monat zwischen dem Zeitpunkt, an dem ich (unwissentlich) meinen Vorrat verloren habe, und dem Zeitpunkt, an dem ich ihn wiedererlangen konnte, vergangen sind.

1 Stimmen

Das sieht gut aus, aber... es listet nicht den Commit für meinen (kürzlich) gelöschten Stash auf - ich habe ihn stattdessen mit einer der "verfluchten anderen" Lösungen gefunden; klar, ich verstehe/erinnere mich nicht an alles, was in deren Befehlen steht, aber es hat mein Problem gelöst, und ich kann immer wieder auf diese Seite zurückkommen (genau wie jedes SO)! Es ist nicht notwendig, einen anderen Befehl zu lernen, der "funktionieren könnte", wenn eine andere Lösung gefunden wurde. Ich bin nicht 100%ig sicher, aber diese Lösung von RobbyD scheint sich nicht auf Verstecke zu erstrecken .

19voto

Koen Punkte 361

Ich konnte keine der Antworten in einem einfachen Befehlsfenster unter Windows (in meinem Fall Windows 7) zum Laufen bringen. awk , grep y Select-string wurden nicht als Befehle erkannt. Also habe ich einen anderen Ansatz versucht:

  • erster Lauf: git fsck --unreachable | findstr "commit"
  • Kopieren der Ausgabe in den Notizblock
  • find replace "unerreichbare Übergabe" with start cmd /k git show

wird in etwa so aussehen:

start cmd /k git show 8506d235f935b92df65d58e7d75e9441220537a4 start cmd /k git show 44078733e1b36962571019126243782421fcd8ae start cmd /k git show ec09069ec893db4ec1901f94eefc8dc606b1dbf1 start cmd /k git show d00aab9198e8b81d052d90720165e48b287c302e

  • als .bat-Datei speichern und ausführen
  • öffnet das Skript eine Reihe von Befehlsfenstern, die jede Übergabe anzeigen
  • wenn Sie das Gesuchte gefunden haben, laufen Sie: git stash apply (your hash)

ist vielleicht nicht die beste Lösung, hat aber bei mir funktioniert

0 Stimmen

Sie können git bash auch unter Windows verwenden. In git bash finden Sie alle (unixoiden) Befehlszeilenwerkzeuge, die Sie benötigen.

0 Stimmen

Sie haben mein Leben gerettet. Wenn Sie jemals Bangladesch besuchen. Rufen Sie mich an, ich werde Ihnen ein kacchi biriyani (ein köstliches Essen) in kacchi bhai und ein Buffet-Abendessen in einem erstklassigen Hotel anbieten. Vielen Dank, Bruder.

15voto

Abhi Punkte 3012

Sie können dies in 2 einfachen Schritten erreichen

  1. Liste verlorener Verstecke --> Führen Sie diesen Befehl für ein Projekt aus, bei dem alle Stashes verloren gegangen sind:

    git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk

  2. Schicke einen verlorenen Vorrat dorthin zurück, wo er herkommt --> Verwenden wir den Commit-Hash des zweiten Stashs:

    git update-ref refs/stash 4b3fc45c94caadcc87d783064624585c194f4be8 -m "Mein wiederhergestellter Vorrat"

0 Stimmen

Keine Notwendigkeit für die -m ist das nur ein zusätzlicher Aufwand. Siehe die Antwort von 2011.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X