Einen Commit rückgängig zu machen ist ein wenig beängstigend, wenn man nicht weiß, wie es funktioniert. Aber es ist eigentlich erstaunlich einfach, wenn Sie es verstehen. Ich zeige Ihnen die 4 verschiedenen Möglichkeiten, wie Sie eine Übergabe rückgängig machen können.
Option 1: git reset --hard
Nehmen wir an, Sie haben Folgendes: C ist Ihr HEAD und (F) ist der Status Ihrer Dateien.
(F)
A-B-C
master
Sie wollen Commit C löschen und nie wieder sehen und alle Änderungen in lokal modifizierten Dateien verlieren . Sie tun dies:
git reset --hard HEAD~1
Das Ergebnis ist:
(F)
A-B
master
Jetzt ist B der KOPF. Weil Sie --hard
werden Ihre Dateien auf den Zustand bei der Übertragung B zurückgesetzt.
Option 2: git reset
Aber nehmen wir mal an, dass Commit C keine Katastrophe war, sondern nur ein bisschen daneben. Sie wollen die Übergabe rückgängig machen, aber Ihre Änderungen beibehalten für ein wenig Bearbeitung, bevor Sie eine bessere Übertragung vornehmen. Beginnen Sie noch einmal von hier, mit C als HEAD:
(F)
A-B-C
master
Sie können dies tun, indem Sie die --hard
:
git reset HEAD~1
In diesem Fall lautet das Ergebnis:
(F)
A-B-C
master
In beiden Fällen ist HEAD nur ein Verweis auf die letzte Übertragung. Wenn Sie eine git reset HEAD~1
weisen Sie Git an, den HEAD-Zeiger um einen Commit zurückzustellen. Aber (außer Sie verwenden --hard
) lassen Sie Ihre Dateien so, wie sie waren. Also jetzt git status
zeigt die Änderungen, die Sie in C eingecheckt hatten. Sie haben nichts verloren!
Option 3: git reset --soft
Für die leichteste Berührung können Sie sogar Ihre Übergabe rückgängig machen, aber Ihre Dateien und Ihre Index :
git reset --soft HEAD~1
Dies lässt nicht nur Ihre Dateien in Ruhe, sondern auch Ihre Index allein. Wenn Sie das tun git status
werden Sie sehen, dass die gleichen Dateien wie zuvor im Index stehen. Tatsächlich könnten Sie direkt nach diesem Befehl Folgendes tun git commit
und Sie würden denselben Commit, den Sie gerade gemacht haben, erneut durchführen.
Option 4: Sie haben git reset --hard
und muss den Code zurückbekommen
Noch eine Sache: Angenommen, Sie zerstören eine Übertragung wie im ersten Beispiel, aber dann feststellen, dass man sie doch braucht ? Pech gehabt, oder?
Nein, es gibt todavía einen Weg, es zurückzubekommen. Typ git reflog
und Sie sehen eine Liste der (teilweisen) Übertragungen Schas (d.h. Hashes), in denen Sie sich bewegt haben. Suchen Sie den Commit, den Sie zerstört haben, und tun Sie dies:
git checkout -b someNewBranchName shaYouDestroyed
Sie haben diese Überweisung jetzt wieder aufleben lassen. Commits werden in Git erst nach etwa 90 Tagen zerstört, so dass Sie normalerweise zurückgehen und einen Commit retten können, den Sie nicht loswerden wollten.
2 Stimmen
Siehe diese Anleitung für das Rückgängigmachen von Git Commits auf Local, Public und Git Branch Wie man Git Commits wie ein Profi rückgängig macht
703 Stimmen
Weißt du, was Git braucht?
git undo
, das war's. Dann verschwindet der Ruf von Git, mit Fehlern von uns Normalsterblichen umzugehen. Implementieren Sie, indem Sie den aktuellen Zustand auf einen Git-Stack schieben, bevor Sie einegit
Befehl. Es würde die Leistung beeinträchtigen, daher wäre es am besten, ein Konfigurations-Flag hinzuzufügen, das angibt, ob es aktiviert werden soll.58 Stimmen
@YiminRong Das kann man mit Git's
alias
Funktion: git-scm.com/book/de/v2/Git-Basics-Git-Aliases137 Stimmen
Für VsCode-Benutzer, geben Sie einfach ctrl +shift +G ein und klicken Sie dann auf drei Punkte, d.h., mehr Optionen und klicken Sie dann auf Undo Last Commit
30 Stimmen
@YiminRong Undo was genau? Es gibt Dutzende von sehr unterschiedlichen funktionalen Fällen, in denen "Rückgängigmachen" etwas bedeutet vollständig anders. Ich würde wetten, dass die Hinzufügung eines neuen "Zauberstabs" nur noch mehr Verwirrung stiften würde.
52 Stimmen
@YiminRong Ich kaufe es nicht. Die Leute würden immer noch herumfummeln und Dinge rückgängig machen, die nicht rückgängig gemacht werden sollen. Aber was noch wichtiger ist,
git reflog
kommt dem, was du beschreibst, schon sehr nahe, gibt dem Benutzer aber mehr Kontrolle darüber, was (un)getan werden soll. Aber bitte, nein, "Rückgängig" funktioniert nicht überall gleich, und die Leute würden erwarten viele verschiedene Dinge, die das Feature erreichen soll. Letzte Übertragung rückgängig machen? Letzte Aktion rückgängig machen? Wenn die letzte Aktion ein Push war, wie genau rückgängig machen, (zurücksetzen und pushen) oder (rückgängig machen und pushen)?10 Stimmen
Um etwas Einfaches in Git zu tun, machen Sie entweder Impossibly Hard Task A oder Impossibly Hard Task B. Dann vermasseln Sie es ein wenig und versuchen, es durch Impossibly Hard Task C oder Impossibly Hard Task D rückgängig zu machen.
4 Stimmen
Git ist ein Framework, das die Versionierung vieler Dateien und die Zusammenarbeit ermöglicht. Es erfordert absolute Kontrolle darüber, was Sie tun, um diese Ziele zu erreichen. Es ist großartig genau weil es versucht, alle unnötige "Magie" wegzulassen. Etwas wie
git undo
ist im Allgemeinen eine schlechte Idee, aber es ist lächerlich einfach zu implementieren, wenn man es wirklich will. Aber seien Sie sich bewusst, dass Sie dann dafür verantwortlich sind. Ich finde es wirklich erstaunlich, wie schnell die Leute die Kontrolle aufgeben, um nichts lernen zu müssen. Git ist einfach Sie müssen nur die Konzepte lernen.3 Stimmen
"Dinge rückgängig machen, die nicht rückgängig gemacht werden sollen" - Diese Dinge wären alle Dinge. Wie kann ich meinen Quellcode wirklich etwas anvertrauen, das mich (oder andere) die Geschichte ändern lässt.
8 Stimmen
Argumentation gegen eine
undo
Befehl ist künstliche Schwerfälligkeit. Ja, Sie können dies mit einer Kombination ausreflog
,reset
etcheckout
. Das Problem ist, dass dies für jeden, der es nicht routinemäßig tut, eine völlig unnatürliche Willensbekundung ist. Mercurial hatrollback
und es hat nichts kaputt gemacht. Git sollte auch etwas haben.4 Stimmen
Sie können Folgendes installieren git-extras die eine Reihe von Git-Hilfsfunktionen sind - enthält die
git undo
Befehl, um die letzte Übertragung rückgängig zu machen. Ich benutze ihn ständig, wenn ich gerade etwas übertragen habe (und noch nicht gepusht habe) und eine nicht übertragene Datei hinzufügen oder den Commit-Kommentar ändern muss.0 Stimmen
@ashad - Ihr Vorschlag war für mich genau richtig! Danke!!
2 Stimmen
In Ihrem Fall können Sie einfach den Git-Reset durchführen (wenn Sie nicht in den Zweig gepusht haben). Wenn Sie bereits in den Zweig gepusht haben, führen Sie git reset --hard HEAD^1 aus.
0 Stimmen
Jedes Mal, wenn ich diesen Beitrag brauche, komme ich hierher, löse mein Problem und sage, was für ein schöner Beitrag :) danke euch allen.