Wie mache ich 'git reset' rückgängig?

1312

Was ist der einfachste Weg, um das rückgängig zu machen

git reset HEAD~

Befehl? Derzeit kann ich mir nur vorstellen, einen "Git-Klon http: // ..." von einem Remote-Repo aus zu erstellen.

Andriy Drozdyuk
quelle
2
Wenn jemand nach einer Möglichkeit sucht, einen Hard-Reset rückgängig zu machen, klicken Sie auf Rückgängig machen eines Git-Resets --hard HEAD ~ 1 . Die Lösungen sind sehr ähnlich.
2
Es ist kein Duplikat der Fragen im Zusammenhang mit --hard! Das Risiko, diesen Befehl versehentlich auszuführen, ist viel höher. Zum Beispiel möchten Sie eine einzelne Datei mit entfernen git reset foo-file. Sie schreiben nur den ersten Teil des Dateinamens, drücken die Tabulatortaste für die automatische Vervollständigung, es wird tatsächlich zu einem Zweignamen vervollständigt, Sie bemerken es nicht und führen git reset foo-branchstattdessen den Befehl aus . Voilà
Yushin Washio

Antworten:

2388

Kurze Antwort:

git reset 'HEAD@{1}'

Lange Antwort:

Git führt ein Protokoll aller Ref-Updates (z. B. Auschecken, Zurücksetzen, Festschreiben, Zusammenführen). Sie können es anzeigen, indem Sie Folgendes eingeben:

git reflog

Irgendwo in dieser Liste befindet sich das Commit, das Sie verloren haben. Angenommen, Sie haben gerade getippt git reset HEAD~und möchten es rückgängig machen. Mein Reflog sieht so aus:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

Die erste Zeile besagt, dass vor HEAD0 Positionen (mit anderen Worten, die aktuelle Position) 3f6db14 ist; es wurde durch Zurücksetzen auf erhalten HEAD~. Die zweite Zeile besagt, dass vor HEAD1 Position (mit anderen Worten der Status vor dem Zurücksetzen) d27924e ist. Es wurde durch Auschecken eines bestimmten Commits erhalten (obwohl dies momentan nicht wichtig ist). Um den Reset rückgängig zu machen, führen Sie git reset HEAD@{1}(oder git reset d27924e) aus.

Wenn Sie andererseits seitdem einige andere Befehle ausgeführt haben, die HEAD aktualisieren, steht das gewünschte Commit nicht ganz oben auf der Liste, und Sie müssen die durchsuchen reflog.

Ein letzter Hinweis: Es ist möglicherweise einfacher, nach dem reflogZweig zu suchen, den Sie zurücksetzen möchten, z. B. Master, als nach HEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

Dies sollte weniger Lärm als der allgemeine haben HEAD reflog.

Mark Lodato
quelle
25
Als visuellere und schönere Alternative zu reflogdiesem Zweck verwende ich gerne git log --graph --decorate --oneline $(git rev-list -g --all). Es zeigt einen Baum aller Commits, einschließlich baumelnder unbenannter Zweige
Texasflood
1
Nehmen wir an, ich habe ein Verzeichnis mit vorhandenen Dateien. In diesem Verzeichnis laufe ich git initund dann gleich danach git reset --hard. Es gibt zunächst kein Reflog oder gar Protokolle. Sind diese Dateien jetzt so ziemlich Toast?
AlanSE
@ Alanse, leider sind diese Dateien Toast, soweit ich weiß. Wenn Sie dies noch nie getan haben git add(dh diese Version der Datei noch nie bereitgestellt haben), wird git checkoutoder git reset --hardwird die einzige Kopie (das Arbeitsverzeichnis) ohne Sicherung weggeblasen. Ich wünschte, es wäre nicht so.
Mark Lodato
2
git reset HEAD~12oops ... git reset HEAD@{12}nooo .. 'git reflog' zur rettung! Oh, es ist nurgit reset HEAD@{1}
Dennis
Nachdem ich den ausgezeichneten Artikel git-scm.com/blog/2011/07/11/reset.html git-reset gelesen habe , bin ich etwas weniger verwirrt.
Andriy Drozdyuk
192

Alte Frage und die geposteten Antworten funktionieren hervorragend. Ich werde mich jedoch für eine andere Option entscheiden.

git reset ORIG_HEAD

ORIG_HEADverweist auf das Commit, auf das HEADzuvor verwiesen wurde.

Dan Fischer
quelle
1
Das scheint großartig - könnten Sie das näher erläutern? Ist "ORIG" hier die Abkürzung für "Original" oder "Ursprung"? … Dh, wird es auf die Position von HEAD zurückgesetzt, bevor mit dem Affen begonnen wurde? Oder wohin HEAD am Ursprung ist? Was passiert, wenn Sie HEAD mehrmals vor dem bewegt haben git reset ORIG_HEAD? Vielen Dank.
Benjohn
ORIG steht für Original, ORIG_HEAD bedeutet Original HEAD vor dem Zurücksetzen
Sam Gallagher
"Bestimmte Vorgänge, wie z. B. Zusammenführen und Zurücksetzen, zeichnen die vorherige Version von HEAD in ORIG_HEAD auf, bevor sie auf einen neuen Wert angepasst wird. Sie können ORIG_HEAD verwenden, um den vorherigen Status wiederherzustellen oder wiederherzustellen oder einen Vergleich durchzuführen." Auszug aus dem Buch: "Versionskontrolle mit Git"
Amirreza
56

Meine Situation war etwas anders, ich habe es git reset HEAD~dreimal gemacht.

Um es rückgängig zu machen, musste ich tun

git reset HEAD@{3}

so sollten Sie in der Lage sein zu tun

git reset HEAD@{N}

Aber wenn Sie Git Reset mit durchgeführt haben

git reset HEAD~3

Sie müssen tun

git reset HEAD@{1}

As {N} steht für die Anzahl der Operationen in Reflog. Wie Mark in den Kommentaren betonte.

Zainengineer
quelle
2
Die akzeptierte Option bietet kein Beispiel für die Weiterleitung. NI befand sich vor einer Stunde in einer Situation, in der ich mehr als 1 weiterleiten wollte. Ich habe mit mehreren versucht und es hat funktioniert. Wollte das hier hinzufügen. Wird nützlich sein für Leute, die nach einem Rückgängigmachen des Zurücksetzens mit dem Zurücksetzen des
Gitters
3
aber wenn jemand git reset HEAD ~ 3 gemacht hat, kann er schnell sehen, wie man es rückgängig macht, git reset HEAD @ {3} ist erforderlich, ohne in reflog git reset HEAD ~ 3 usw. zu gehen, ist eine häufige Situation
zainengineer
1
Ich denke, jeder, der {1} / {2} sieht, würde erkennen, dass die Nummer eine beliebige Revisionsnummer sein kann, die reflogIhnen der Befehl zur Verfügung stellt. Einverstanden, dass Ihr Standpunkt, dass die Zahlen für beide Richtungen gleich sind ~ 3 / @ {3}, aber nicht unbedingt eine neue Antwort sein muss.
Clint
30

1.Verwenden Sie git reflog, um alle Referenzen zu aktualisieren.

2.git reset <id_of_commit_to_which_you_want_restore>

Omilus
quelle