Ist es möglich, die durch den folgenden Befehl verursachten Änderungen rückgängig zu machen? Wenn das so ist, wie?
git reset --hard HEAD~1
Paul Wick
Ist es möglich, die durch den folgenden Befehl verursachten Änderungen rückgängig zu machen? Wenn das so ist, wie?
git reset --hard HEAD~1
Brian Riehmann
Pat Notz hat recht. Sie können die Zusage zurückerhalten, solange sie nicht länger als ein paar Tage zurückliegt. git sammelt nur nach ungefähr einem Monat Garbage Collection, es sei denn, Sie weisen es ausdrücklich an, neuere Blobs zu entfernen.
$ git init
Initialized empty Git repository in .git/
$ echo "testing reset" > file1
$ git add file1
$ git commit -m 'added file1'
Created initial commit 1a75c1d: added file1
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 file1
$ echo "added new file" > file2
$ git add file2
$ git commit -m 'added file2'
Created commit f6e5064: added file2
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 file2
$ git reset --hard HEAD^
HEAD is now at 1a75c1d... added file1
$ cat file2
cat: file2: No such file or directory
$ git reflog
1a75c1d... HEAD@{0}: reset --hard HEAD^: updating HEAD
f6e5064... HEAD@{1}: commit: added file2
$ git reset --hard f6e5064
HEAD is now at f6e5064... added file2
$ cat file2
added new file
Sie können im Beispiel sehen, dass die Datei2 infolge des Hard-Resets entfernt wurde, aber beim Zurücksetzen über das Reflog wieder eingefügt wurde.
Sie können “git reset –hard HEAD@{1}” verwenden, es ist keine Verwendung von SHA1 erforderlich. In den meisten Fällen sollte es ausreichen, “git reset –hard ORIG_HEAD” zu verwenden.
– Jakub Narębski
21. Mai 2009 um 6:17 Uhr
git log -g
kann ein bisschen schöner sein, um das Reflog anzuzeigen als git reflog
.
– Dan Formen
28. Oktober 2010 um 13:09 Uhr
Es gibt eine sehr wichtige Einschränkung dabei … und das ist der “–harte” Teil. –hard bläst Ihre lokalen, nicht festgeschriebenen Änderungen weg. Und Sie können sie so nicht zurückbekommen (da sie nirgendwo begangen wurden). Ich glaube dagegen kann man nichts machen 🙁
– Michael Anderson
4. August 2011 um 5:05 Uhr
^ Nur damit Sie wissen, dass Sie Ihre lokalen Änderungen speichern können, bevor Sie einen Reset durchführen – hart, und sie dann einfach löschen und Sie verlieren nichts! Ich muss Idioten lieben.
– Lethjakman
1. September 2014 um 2:49 Uhr
ich bevorzuge git reflog
über git log -g
einfach, weil Sie alle Informationen in einer Zeile erhalten, in der sha1, HEAD info und Commit-Nachrichten alle aufgereiht sind. Viel einfacher zu lesen.
– Schneefall
11. November 2014 um 18:41 Uhr
Pat Notz
Was Sie tun möchten, ist, den sha1 des Commits anzugeben, auf den Sie wiederherstellen möchten. Sie können den sha1 erhalten, indem Sie das Reflog untersuchen (git reflog
) und dann tun
git reset --hard <sha1 of desired commit>
Aber warte nicht zu lange… nach ein paar Wochen wird Git diesen Commit schließlich als nicht referenziert sehen und alle Blobs löschen.
Warnung für mich selbst vor ein paar Minuten: Dadurch werden alle Änderungen zurückgesetzt. Es berührt jedoch nicht die nicht verfolgten Dateien.
– mehov
9. Januar 2018 um 10:20 Uhr
Danke, das hat mich gerettet, nachdem ich versehentlich einen großen Commit entfernt habe, Git sollte eigentlich einen Bestätigungsdialog für diese Befehle haben.
– Ghost3t
21. Februar um 19:52 Uhr
Die Antwort ist in der detaillierten Antwort oben versteckt, Sie können einfach Folgendes tun:
$> git reset --hard HEAD@{1}
(Siehe die Ausgabe von git reflog anzeigen)
Beachten Sie, dass dies nicht die Lösung ist, wenn Sie seit dem Zurücksetzen andere Repo-Änderungen vorgenommen haben. Werfen Sie auf jeden Fall einen Blick auf das Reflog, bevor Sie etwas ausführen.
– forresthopkinsa
12. Juni 2017 um 19:06 Uhr
Habe versehentlich mein Repository zurückgesetzt, dachte, meine Arbeit wäre für immer verloren. Diese Antwort hat mir den Tag gerettet.
– Zaiyang Li
25. Juli 2018 um 15:12 Uhr
Wow! du hast mir echt den tag gerettet =)
– jfcogato
14. März 2019 um 9:22 Uhr
sverrejoh
Es ist möglich, es wiederherzustellen, wenn Git noch keine Garbage Collection durchgeführt hat.
Verschaffen Sie sich einen Überblick über schwebende Commits mit fsck
:
$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf
Stellen Sie das baumelnde Commit mit Rebase wieder her:
$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf
Suhaivs
Soweit ich weiss, --hard
verwirft nicht festgeschriebene Änderungen. Da diese nicht von git verfolgt werden. Aber man kann das rückgängig machen discarded commit
.
$ git reflog
wird auflisten:
b0d059c HEAD@{0}: reset: moving to HEAD~1
4bac331 HEAD@{1}: commit: added level introduction....
....
wo 4bac331
ist der discarded commit
.
Bewegen Sie jetzt einfach den Kopf zu diesem Commit:
$ git reset --hard 4bac331
du hast mich vor der feuerung bewahrt
– JJ Strahl
7. Januar 2021 um 23:56 Uhr
Chris
Wenn Sie wirklich Glück haben, wie ich es war, können Sie zu Ihrem Texteditor zurückkehren und auf “Rückgängig” klicken.
Ich weiß, das ist nicht wirklich eine richtige Antwort, aber es hat mir einen halben Tag Arbeit erspart, also wird es hoffentlich dasselbe für jemand anderen tun!
du hast mich vor der feuerung bewahrt
– JJ Strahl
7. Januar 2021 um 23:56 Uhr
Gemeinschaft
Je nachdem, in welchem Zustand sich Ihr Repository befand, als Sie den Befehl ausgeführt haben, sind die Auswirkungen von git reset --hard
kann von trivial über rückgängig machen bis hin zu im Grunde unmöglich reichen.
Im Folgenden habe ich eine Reihe verschiedener möglicher Szenarien aufgelistet und wie Sie sich davon erholen können.
Diese Situation tritt normalerweise auf, wenn Sie laufen git reset
mit einem Argument, wie in git reset --hard HEAD~
. Keine Sorge, das ist leicht zu erholen!
Wenn du nur gerannt bist git reset
und seitdem nichts anderes mehr getan haben, können Sie mit diesem Einzeiler dorthin zurückkehren, wo Sie waren:
git reset --hard @{1}
Dadurch wird Ihr aktueller Zweig in dem Zustand zurückgesetzt, in dem er sich vor der letzten Änderung befand (in Ihrem Fall wäre die letzte Änderung am Zweig der Hard-Reset, den Sie rückgängig machen möchten).
Wenn Sie jedoch verfügen über seit dem Zurücksetzen andere Änderungen an Ihrem Zweig vorgenommen haben, funktioniert der obige Einzeiler nicht. Stattdessen sollten Sie laufen git reflog
<branchname>
, um eine Liste aller kürzlich an Ihrem Zweig vorgenommenen Änderungen (einschließlich Zurücksetzungen) anzuzeigen. Diese Liste wird in etwa so aussehen:
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 möchten. Im obigen Beispiel wäre es die erste Zeile, die besagt: “reset: moving to HEAD~”. Kopieren Sie dann die Repräsentation des Commits Vor (unten) diese Operation. In unserem Fall wäre das master@{1}
(oder 3ae5027
sie repräsentieren beide denselben Commit) und laufen git reset --hard <commit>
um Ihren aktuellen Zweig auf diesen Commit zurückzusetzen.
git add
, aber nie begangen. Jetzt sind meine Änderungen weg!Dies ist etwas schwieriger, sich davon zu erholen. git tut Sie 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 auf einmal wiederherstellen. Stattdessen müssen Sie die einzelnen Dateien in der Datenbank von git suchen und manuell wiederherstellen. Sie können dies mit tun git fsck
.
Einzelheiten dazu finden Sie unter Undo git reset –hard with uncommitted files in the staging area.
git add
, und nie begangen. Jetzt sind meine Änderungen weg!Äh oh. Ich hasse es, dir das zu sagen, aber du hast wahrscheinlich kein Glück. git speichert keine Änderungen, die Sie nicht hinzufügen oder festschreiben, und gemäß der Dokumentation für git reset
:
–schwer
Setzt den Index und den Arbeitsbaum zurück. Alle Änderungen an nachverfolgten Dateien in der Arbeitsstruktur seitdem
<commit>
werden verworfen.
Es ist möglich, dass Sie könnte Sie können Ihre Änderungen mit einem Festplattenwiederherstellungsprogramm oder einem professionellen Datenwiederherstellungsdienst wiederherstellen, aber an diesem Punkt ist das wahrscheinlich mehr Ärger als es wert ist.
Einzeiler hat für mich funktioniert, danke, aber ich frage mich nur, was genau das “@{1}” tut.
– Stan Bashtavenko
30. November 2015 um 19:45 Uhr
@StanB Die Dokumentation ist hier: git-scm.com/docs/git-rev-parse im Grunde bezieht es sich auf den ersten Reflog-Eintrag im aktuellen Zweig.
– Ajedi32
30. November 2015 um 20:44 Uhr
Danke, dass Sie alle Fälle abgedeckt haben. Ich hatte meine nicht begangen oder hinzugefügt.
– xdhmoore
28. Februar 2018 um 20:23 Uhr
Ich habe eine vollständige Anleitung zur Wiederherstellung verlorener Commits mit Git geschrieben. Es hat sogar Illustrationen 🙂 [Check it out][fixLink] [fixLink]: programblings.com/2008/06/07/…
– webmat
16. September 2008 um 17:13 Uhr
--hard
verwirft nicht festgeschriebene Änderungen. Da diese nicht von Git verfolgt werden, gibt es keine Möglichkeit, sie über Git wiederherzustellen.– Zaz
8. August 2013 um 22:22 Uhr
stackoverflow.com/questions/34519665/…
– CodeWizard
7. Mai 2016 um 22:25 Uhr
Dies ist ein großartiger Artikel, der Sie bei der Wiederherstellung Ihrer Dateien unterstützt.
– Jan Schwarz
22. Oktober 2016 um 11:10 Uhr
Dies ist eine großartige Ressource direkt von Github: Wie man mit Git (fast) alles rückgängig macht
– Jasonleonhard
3. Februar 2017 um 21:15 Uhr