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
git
version-control
git-reset
Paul Wicks
quelle
quelle
--hard
verwirft nicht festgeschriebene Änderungen. Da diese nicht von Git verfolgt werden, gibt es keine Möglichkeit, sie über Git wiederherzustellen.Antworten:
Pat Notz ist richtig. Sie können das Commit zurückerhalten, solange es innerhalb weniger Tage erfolgt ist. Git sammelt nur Müll nach ungefähr einem Monat oder so, es sei denn, Sie weisen ihn ausdrücklich an, neuere Blobs zu entfernen.
Sie können im Beispiel sehen, dass die Datei2 infolge des Hard-Reset entfernt wurde, aber beim Zurücksetzen über das Reflog wieder eingesetzt wurde.
quelle
git log -g
kann ein bisschen schöner sein, um das Reflog zu sehen alsgit reflog
.git reflog
esgit log -g
einfach, weil Sie alle Informationen in einer Zeile mit sha1, HEAD-Informationen und Commit-Nachrichten erhalten. Viel einfacher zu lesen.Sie möchten lediglich die sha1 des Commits angeben, auf dem Sie wiederherstellen möchten. Sie können die sha1 erhalten, indem Sie das reflog (
git reflog
) untersuchen und dann tungit reset --hard <sha1 of desired commit>
Aber warten Sie nicht zu lange ... nach ein paar Wochen wird git das Commit irgendwann als nicht referenziert ansehen und alle Blobs löschen.
quelle
Die Antwort ist in der obigen detaillierten Antwort versteckt. Sie können einfach Folgendes tun:
(Siehe die Ausgabe von Git Reflog Show )
quelle
Es ist möglich, es wiederherzustellen, wenn Git noch keinen Müll gesammelt hat.
Verschaffen Sie sich einen Überblick über baumelnde Commits mit
fsck
:Stellen Sie das baumelnde Commit mit Rebase wieder her:
quelle
Wenn Sie wirklich Glück haben, wie ich es war, können Sie in Ihren Texteditor zurückkehren und auf "Rückgängig" klicken.
Ich weiß, dass das nicht wirklich die richtige Antwort ist, aber es hat mir einen halben Tag Arbeit erspart, also hoffentlich wird es dasselbe für jemand anderen tun!
quelle
Soweit ich weiß,
--hard
werden nicht festgeschriebene Änderungen verworfen. Da diese nicht von git verfolgt werden. aber Sie können das rückgängig machendiscarded commit
.Willenslisten:
wo
4bac331
ist dasdiscarded commit
.Bewegen Sie nun einfach den Kopf zu diesem Commit ::
quelle
Beispiel für einen IRL-Fall:
$ git fsck --lost-found
$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a
$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a
quelle
In den meisten Fällen ja.
Abhängig von dem Status, in dem sich Ihr Repository befand, als Sie den Befehl ausgeführt haben, können die Auswirkungen
git reset --hard
von trivial über rückgängig bis grundsätzlich 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 festgeschrieben, aber jetzt sind die Festschreibungen weg!
Diese Situation tritt normalerweise auf, wenn Sie
git reset
mit einem Argument wie in ausgeführt werdengit reset --hard HEAD~
. Keine Sorge, das ist leicht zu beheben!Wenn Sie gerade gelaufen sind
git reset
und seitdem nichts mehr getan haben, können Sie mit diesem Einzeiler dorthin zurückkehren, wo Sie waren:Dadurch wird Ihr aktueller Zweig in den Status zurückgesetzt, in dem er sich vor der letzten Änderung befand (in Ihrem Fall ist die letzte Änderung am Zweig der Hard-Reset, den Sie rückgängig machen möchten).
Wenn Sie jedoch seit dem Zurücksetzen andere Änderungen an Ihrem Zweig vorgenommen haben, funktioniert der oben genannte Einzeiler nicht. Stattdessen sollten Sie eine Liste aller zuletzt an Ihrem Zweig vorgenommenen Änderungen (einschließlich Zurücksetzen) anzeigen. Diese Liste sieht ungefähr so aus:
git reflog
<branchname>
Suchen Sie in dieser Liste den Vorgang, den Sie "rückgängig machen" möchten. Im obigen Beispiel wäre es die erste Zeile mit der Aufschrift "Zurücksetzen: Bewegen zu HEAD ~". Kopieren Sie dann die Darstellung des Commits vor (unten) dieser Operation. In unserem Fall wäre dies
master@{1}
(oder3ae5027
beide stellen dasselbe Commit dar) und wird ausgeführtgit reset --hard <commit>
, um Ihren aktuellen Zweig auf dieses Commit zurückzusetzen.Ich habe meine Änderungen mit inszeniert, mich
git add
aber nie verpflichtet. Jetzt sind meine Änderungen weg!Dies ist etwas schwieriger zu beheben. git verfügt zwar über Kopien der von Ihnen hinzugefügten Dateien, aber da diese Kopien nie an ein bestimmtes 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
.Weitere Informationen hierzu finden Sie unter Rückgängig machen des Zurücksetzens von Git --hard mit nicht festgeschriebenen Dateien im Staging-Bereich .
Ich hatte Änderungen an Dateien in meinem Arbeitsverzeichnis, mit denen ich nie inszeniert
git add
und nie festgeschrieben habe. Jetzt sind meine Änderungen weg!Oh oh. Ich hasse es, Ihnen das zu sagen, aber Sie haben wahrscheinlich kein Glück. git speichert keine Änderungen, die Sie nicht hinzufügen oder festschreiben, und gemäß der Dokumentation für
git reset
:Es ist möglich , dass Sie vielleicht Ihre Änderungen mit irgendeiner Art von Disk Recovery - Dienstprogramm oder einem professionellen Datenrettungs - Service erholen können, aber an diesem Punkt, als es wert ist wahrscheinlich mehr Mühe ist.
quelle
Wenn Sie Ihr Repository noch nicht mit Müll gesammelt haben (z. B. mit
git repack -d
odergit gc
, aber beachten Sie, dass die Speicherbereinigung auch automatisch erfolgen kann), ist Ihr Commit immer noch vorhanden - es ist nur nicht mehr über den HEAD erreichbar.Sie können versuchen, Ihr Commit zu finden, indem Sie die Ausgabe von durchsehen
git fsck --lost-found
.Neuere Versionen von Git haben das sogenannte "Reflog", ein Protokoll aller Änderungen, die an den Refs vorgenommen werden (im Gegensatz zu Änderungen, die am Repository-Inhalt vorgenommen werden). So wird beispielsweise jedes Mal, wenn Sie Ihren HEAD wechseln (dh jedes Mal, wenn Sie einen
git checkout
Zweig wechseln), der protokolliert wird. Und natürlich haben Siegit reset
auch den KOPF manipuliert, sodass er auch protokolliert wurde. Sie können auf ältere Status Ihrer Refs auf ähnliche Weise zugreifen wie auf ältere Status Ihres Repositorys, indem Sie ein@
Zeichen anstelle eines~
, wie verwendengit reset HEAD@{1}
.Es hat eine Weile gedauert, bis ich verstanden habe, was der Unterschied zwischen HEAD @ {1} und HEAD ~ 1 ist. Hier ist eine kleine Erklärung:
Bedeutet
HEAD~1
also "gehe zum Commit vor dem Commit, auf das HEAD derzeit zeigt", währendHEAD@{1}
bedeutet "Gehe zu dem Commit, auf das HEAD zeigte, bevor es darauf zeigte, wo es aktuell zeigt".Auf diese Weise können Sie Ihr verlorenes Commit leicht finden und wiederherstellen.
quelle
Bevor Sie antworten, fügen Sie einige Hintergrundinformationen hinzu und erklären, was dies ist
HEAD
.First of all what is HEAD?
HEAD
ist einfach ein Verweis auf das aktuelle Commit (aktuell) in der aktuellen Verzweigung.Es kann immer nur eine einzige
HEAD
geben. (ausgenommengit worktree
)Der Inhalt von
HEAD
wird darin gespeichert.git/HEAD
und enthält die 40 Bytes SHA-1 des aktuellen Commits.detached HEAD
Wenn Sie sich nicht im letzten Commit befinden, bedeutet dies, dass
HEAD
auf ein vorheriges Commit in der Geschichte verwiesen wirddetached HEAD
.In der Befehlszeile sieht es so aus: SHA-1 anstelle des Zweignamens, da der
HEAD
nicht auf die Spitze des aktuellen Zweigs zeigtEinige Optionen zur Wiederherstellung nach einem abgetrennten KOPF:
git checkout
Dadurch wird ein neuer Zweig ausgecheckt, der auf das gewünschte Commit verweist.
Dieser Befehl checkt zu einem bestimmten Commit aus.
An diesem Punkt können Sie einen Zweig erstellen und ab diesem Punkt mit der Arbeit beginnen.
git reflog
Sie können immer die verwenden
reflog
.git reflog
zeigt jede Änderung an, die das aktualisiert hat,HEAD
und das Auschecken des gewünschten Reflog-Eintrags setzt dasHEAD
diesen Commit zurück.Jedes Mal, wenn der KOPF geändert wird, wird ein neuer Eintrag in der
reflog
Dadurch kehren Sie zu Ihrem gewünschten Commit zurück
git reset HEAD --hard <commit_id>
Bewegen Sie Ihren Kopf zurück zum gewünschten Commit.
Sie auch das verwenden
git rebase --no-autostash
.git revert <sha-1>
"Rückgängig machen" des angegebenen Commits oder Commit-Bereichs.
Der Befehl zum Zurücksetzen "macht" alle Änderungen rückgängig, die im angegebenen Commit vorgenommen wurden.
Ein neues Commit mit dem Undo-Patch wird festgeschrieben, während das ursprüngliche Commit ebenfalls im Verlauf verbleibt.
Dieses Schema zeigt, welcher Befehl was tut.
Wie Sie dort sehen können,
reset && checkout
ändern Sie dieHEAD
.quelle
git reset HEAD --hard <commit_id>
Beispiel von stackoverflow.com/questions/4114095/… stammt. - Wenn dies der Fall ist, können Sie dies bitte in der Namensnennung bearbeiten.git reflog
git cherry-pick <the sha>
quelle
Ich weiß, dass dies ein alter Thread ist ... aber da viele Leute nach Möglichkeiten suchen, Dinge in Git rückgängig zu machen, halte ich es dennoch für eine gute Idee, hier weiterhin Tipps zu geben.
Wenn Sie ein "Git hinzufügen" oder etwas von oben links nach unten links in Git GUI verschieben, wird der Inhalt der Datei in einem Blob gespeichert und der Dateiinhalt kann von diesem Blob wiederhergestellt werden.
So ist es möglich, eine Datei wiederherzustellen, auch wenn sie nicht festgeschrieben wurde, aber hinzugefügt werden muss.
Jetzt wird der Blob erstellt, aber er wird vom Index referenziert, sodass er erst mit git fsck aufgelistet wird, wenn wir ihn zurücksetzen. Also setzen wir zurück ...
Sie erhalten einen baumelnden Blob ce013625030ba8dba906f756967f9e9ca394464a
gibt Ihnen den Dateiinhalt "Hallo" zurück
Um nicht referenzierte Commits zu finden, habe ich irgendwo einen Tipp gefunden, der dies vorschlägt.
Ich habe es als Werkzeug in Git Gui und es ist sehr praktisch.
quelle
git fsck --lost-found
kann dies helfen.Wenn Sie eine JetBrains-IDE (alles, was auf IntelliJ basiert) verwenden, können Sie auch Ihre nicht festgeschriebenen Änderungen über die Funktion "Lokaler Verlauf" wiederherstellen.
Klicken Sie mit der rechten Maustaste auf Ihr oberstes Verzeichnis in Ihrer Dateibaumstruktur, suchen Sie im Kontextmenü nach "Lokaler Verlauf" und wählen Sie "Verlauf anzeigen". Dies öffnet eine Ansicht, in der Ihre letzten Änderungen gefunden werden können. Wenn Sie die Revision gefunden haben, zu der Sie zurückkehren möchten, klicken Sie mit der rechten Maustaste darauf und klicken Sie auf "Zurücksetzen".
quelle
Ich habe gerade einen Hard-Reset für ein falsches Projekt durchgeführt. Was mein Leben rettete, war die lokale Geschichte von Eclipse. IntelliJ Idea soll auch eine haben, und Ihr Redakteur kann es auch überprüfen:
quelle
Erstellt ein winziges Skript, um das Auffinden des gesuchten Commits etwas zu erleichtern:
git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'
Ja, es kann mit awk oder so etwas wesentlich hübscher gemacht werden, aber es ist einfach und ich brauchte es einfach. Könnte jemand anderem 30 Sekunden sparen.
quelle
Mein Problem ist fast ähnlich. Ich habe nicht festgeschriebene Dateien, bevor ich eingebe
git reset --hard
.Gott sei Dank. Ich habe es geschafft, all diese Ressourcen zu überspringen. Nachdem ich bemerkt habe, dass ich einfach rückgängig machen kann (
ctrl-z
). 😊 Ich möchte dies nur zu allen obigen Antworten hinzufügen.Hinweis. Es ist nicht möglich,
ctrl-z
Dateien zu öffnen.quelle
Das hat mein Leben gerettet:
https://medium.com/@CarrieGuss/how-to-recover-from-a-git-hard-reset-b830b5e3f60c
Grundsätzlich müssen Sie ausführen:
Gehen Sie dann manuell durch die Schmerzen, um Ihre Dateien in der richtigen Struktur neu zu organisieren.
Imbiss: Verwenden
git reset --hard
Sie es niemals, wenn Sie nicht zu 100% verstehen, wie es funktioniert. Verwenden Sie es am besten nicht.quelle