1684 Stimmen

Wie kann ich git reset --hard HEAD~1 rückgängig machen?

Ist es möglich, die durch den folgenden Befehl verursachten Änderungen rückgängig zu machen? Wenn ja, wie?

git reset --hard HEAD~1

15 Stimmen

Ich habe eine vollständige Anleitung zur Wiederherstellung eines verlorenen Commits mit Git geschrieben. Es gibt sogar Illustrationen :-) [Check it out][fixLink] [fixLink]: programblings.com/2008/06/07/

39 Stimmen

--hard verwirft unbestätigte Änderungen. Da diese nicht von Git verfolgt werden, gibt es keine Möglichkeit, sie mit Git wiederherzustellen.

0 Stimmen

87voto

Chris Punkte 38327

Wenn Sie wirklich Glück haben, so wie ich es hatte, können Sie zu Ihrem Texteditor zurückgehen und auf "Rückgängig" klicken.

Ich weiß, dass das keine richtige Antwort ist, aber es hat mir einen halben Tag Arbeit erspart und ich hoffe, dass es für jemand anderen dasselbe bedeutet!

4 Stimmen

Das ist wirklich ein sehr guter Tipp, der mir viel Zeit erspart hat ;) Und es ist viel einfacher, als irgendetwas in Git zu tun...

5 Stimmen

Und ich danke dir für alles Gute auf dieser Welt. danke. danke. danke. danke.

18 Stimmen

Dies ist die einzige Möglichkeit, nach dem Hard-Reset noch nicht vorgenommene Änderungen an Dateien wiederherzustellen. Hat mich auch gerettet ;)

71voto

Ajedi32 Punkte 40666

In den meisten Fällen, ja.

Je nachdem, in welchem Zustand sich Ihr Projektarchiv befand, als Sie den Befehl ausführten, können die Auswirkungen von git reset --hard können von leicht rückgängig zu machen bis hin zu praktisch unmöglich reichen.

Im Folgenden habe ich eine Reihe verschiedener möglicher Szenarien aufgelistet, und wie Sie sich davon erholen können.

Alle meine Änderungen wurden übertragen, aber jetzt sind die Übertragungen weg!

Diese Situation tritt normalerweise auf, wenn Sie git reset mit einem Argument, wie in git reset --hard HEAD~ . Keine Sorge, das ist leicht zu beheben!

Wenn Sie gerade git reset und seitdem nichts anderes gemacht haben, können Sie mit diesem Einzeiler wieder dorthin zurückkehren, wo Sie waren:

git reset --hard @{1}

Dies setzt Ihren aktuellen Zweig in den Zustand zurück, in dem er sich vor der letzten Änderung befand (in Ihrem Fall wäre die letzte Änderung am Zweig der harte Reset, den Sie rückgängig machen wollen).

Wenn Sie jedoch haben seit dem Zurücksetzen andere Änderungen an Ihrem Zweig vorgenommen haben, wird der obige Einzeiler nicht funktionieren. Stattdessen sollten Sie Folgendes ausführen git reflog <branchname> um eine Liste aller kürzlich an Ihrer Verzweigung vorgenommenen Änderungen (einschließlich Zurücksetzungen) anzuzeigen. Diese Liste sieht dann etwa so aus:

7c169bd master@{0}: reset: moving to HEAD~
3ae5027 master@{1}: commit: Changed file2
7c169bd master@{2}: commit: Some change
5eb37ca master@{3}: commit (initial): Initial commit

Suchen Sie in dieser Liste den Vorgang, den Sie "rückgängig" machen wollen. Im obigen Beispiel wäre das die erste Zeile, in der steht "reset: moving to HEAD~". Kopieren Sie dann die Darstellung der Übergabe vor (unten) diese Operation. In unserem Fall wäre das master@{1} (ou 3ae5027 (beide stehen für dieselbe Übergabe), und führen Sie git reset --hard <commit> um Ihren aktuellen Zweig auf diese Übergabe zurückzusetzen.

Ich inszenierte meine Änderungen mit git add , aber nie festgelegt. Jetzt sind meine Änderungen weg!

Dies ist etwas schwieriger zu beheben. git tut haben Kopien der Dateien, die Sie hinzugefügt haben, aber da diese Kopien nie an einen bestimmten Commit gebunden waren, können Sie die Änderungen nicht alle auf einmal wiederherstellen. Stattdessen müssen Sie die einzelnen Dateien in der Git-Datenbank suchen und sie manuell wiederherstellen. Sie können dies tun mit git fsck .

Einzelheiten hierzu finden Sie unter Rückgängig machen von git reset --hard mit nicht übertragenen Dateien im Bereitstellungsbereich .

Ich hatte Änderungen an Dateien in meinem Arbeitsverzeichnis, die ich nie mit git add und nie begangen. Jetzt sind meine Änderungen weg!

Oh, oh. Ich sage es Ihnen nur ungern, aber Sie haben wahrscheinlich Pech. git speichert keine Änderungen, die Sie nicht selbst hinzufügen oder übertragen, und laut der Dokumentation für git reset :

--hart

Setzt den Index und den Arbeitsbaum zurück. Alle Änderungen an verfolgten Dateien im Arbeitsbaum seit <commit> werden verworfen.

Es ist möglich, dass Sie könnte Vielleicht können Sie Ihre Änderungen mit einem Festplattenwiederherstellungsprogramm oder einem professionellen Datenwiederherstellungsdienst wiederherstellen, aber das ist zu diesem Zeitpunkt wahrscheinlich mehr Aufwand als es wert ist.

1 Stimmen

Der Einzeiler hat bei mir funktioniert, danke, aber ich frage mich, was genau dieses "@{1}" bewirkt

1 Stimmen

@StanB Die Dokumentation finden Sie hier: git-scm.com/docs/git-rev-parse bezieht sich grundsätzlich auf den ersten Reflog-Eintrag im aktuellen Zweig.

0 Stimmen

Danke, dass Sie alle Fälle behandelt haben. Ich hatte meine noch nicht festgelegt oder hinzugefügt.

45voto

Stian Høiland Punkte 3585

Beispiel für einen IRL-Fall:

$ git fsck --lost-found

Checking object directories: 100% (256/256), done.
Checking objects: 100% (3/3), done.
dangling blob 025cab9725ccc00fbd7202da543f556c146cb119
dangling blob 84e9af799c2f5f08fb50874e5be7fb5cb7aa7c1b
dangling blob 85f4d1a289e094012819d9732f017c7805ee85b4
dangling blob 8f654d1cd425da7389d12c17dd2d88d318496d98
dangling blob 9183b84bbd292dcc238ca546dab896e073432933
dangling blob 1448ee51d0ea16f259371b32a557b60f908d15ee
dangling blob 95372cef6148d980ab1d7539ee6fbb44f5e87e22
dangling blob 9b3bf9fb1ee82c6d6d5ec9149e38fe53d4151fbd
dangling blob 2b21002ca449a9e30dbb87e535fbd4e65bac18f7
dangling blob 2fff2f8e4ea6408ac84a8560477aa00583002e66
dangling blob 333e76340b59a944456b4befd0e007c2e23ab37b
dangling blob b87163c8def315d40721e592f15c2192a33816bb
dangling blob c22aafb90358f6bf22577d1ae077ad89d9eea0a7
dangling blob c6ef78dd64c886e9c9895e2fc4556e69e4fbb133
dangling blob 4a71f9ff8262701171d42559a283c751fea6a201
dangling blob 6b762d368f44ddd441e5b8eae6a7b611335b49a2
dangling blob 724d23914b48443b19eada79c3eb1813c3c67fed
dangling blob 749ffc9a412e7584245af5106e78167b9480a27b
dangling commit f6ce1a403399772d4146d306d5763f3f5715cb5a    <- it's this one

$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a

commit f6ce1a403399772d4146d306d5763f3f5715cb5a
Author: Stian Gudmundsen Høiland <stian@Stians-Mac-mini.local>
Date:   Wed Aug 15 08:41:30 2012 +0200

    *MY COMMIT MESSAGE IS DISPLAYED HERE*

diff --git a/Some.file b/Some.file
new file mode 100644
index 0000000..15baeba
--- /dev/null
+++ b/Some.file
*THE WHOLE COMMIT IS DISPLAYED HERE*

$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a

First, rewinding head to replay your work on top of it...
Fast-forwarded master to f6ce1a403399772d4146d306d5763f3f5715cb5a.

2 Stimmen

Baumelnder Klecks klingt wie ein AD&D-Monster!

0 Stimmen

Danke @Stian Gut erklärt! Für andere, die diese Antwort finden, möchte ich noch hinzufügen, dass es nicht sicher ist, dass Sie die letzte Zeile rebase machen wollen, wenn Sie mehr als einen "baumelnden" Commit haben :)

0 Stimmen

Git show hat einige meiner Dateien gerettet, vielen Dank, Kumpel!

35voto

ScottyBlades Punkte 9468

git reflog

  • Suchen Sie Ihr Commit Sha in der Liste, kopieren Sie es und fügen Sie es in diesen Befehl ein:

git cherry-pick <the sha>

1 Stimmen

Git-cherry-pick - Wendet die Änderungen an, die durch einige bestehende Commits eingeführt wurden. Ich denke, es ist einfach und sehr hilfreich in diesem Zusammenhang

2 Stimmen

Jeder sucht danach, wenn er nach der Rückgängigmachung von Hard-Reset-Änderungen sucht. Diese Antwort sollte mehr Upvotes bekommen.

3 Stimmen

Das ist es, du hast gerade meinen Tag gerettet

29voto

Newbyte Punkte 1676

Wenn Sie eine JetBrains-IDE verwenden (alles, was auf IntelliJ basiert), können Sie über die Funktion "Local History" sogar Ihre nicht bestätigten Änderungen wiederherstellen.

Klicken Sie mit der rechten Maustaste auf Ihr oberstes Verzeichnis in Ihrem Dateibaum, suchen Sie im Kontextmenü "Lokaler Verlauf" und wählen Sie "Verlauf anzeigen". Daraufhin öffnet sich eine Ansicht, in der Ihre letzten Bearbeitungen zu finden sind. Sobald Sie die Revision gefunden haben, zu der Sie zurückkehren möchten, klicken Sie mit der rechten Maustaste darauf und dann auf "Zurücksetzen".

1 Stimmen

Diese Funktion ist ein Lebensretter für diejenigen, die mit Git nicht so gut umgehen können (wie ich).

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