26188 Stimmen

Wie kann ich die letzten lokalen Übertragungen in Git rückgängig machen?

Ich habe aus Versehen die falschen Dateien übertragen a Git aber den Commit noch nicht auf den Server gepusht.

Wie kann ich diese Übertragungen aus dem lokalen Repository rückgängig machen ?

Die einzige Möglichkeit scheint zu sein, die Änderungen in einen GUI-Texteditor zu kopieren, dann den gesamten lokalen Klon zu löschen, dann das Repository neu zu klonen und dann die Änderungen erneut anzuwenden. Allerdings,

  • Dies kann zu Datenverlusten führen.
  • Es ist sehr schwer, dies zu tun, wenn nur eine zufällige git commit ausgeführt wurde.

Gibt es einen besseren Weg?

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 eine git 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-Aliases

28683voto

Esko Luontola Punkte 71758

Rückgängig machen einer Übertragung und Wiederholung

$ git commit -m "Something terribly misguided" # (0: Your Accident)
$ git reset HEAD~                              # (1)
[ edit files as necessary ]                    # (2)
$ git add .                                    # (3)
$ git commit -c ORIG_HEAD                      # (4)
  1. git reset ist der Befehl, der für die rückgängig machen . Es macht Ihre letzte Übertragung rückgängig, während Ihr Arbeitsbaum (der Zustand Ihrer Dateien auf der Festplatte) bleibt unberührt. Sie müssen sie erneut hinzufügen, bevor Sie sie erneut festlegen können).
  2. Korrekturen vornehmen an Arbeitsbaum Dateien.
  3. git add alles, was Sie in Ihre neue Übertragung aufnehmen wollen.
  4. Übertragen Sie die Änderungen unter Wiederverwendung der alten Commit-Nachricht. reset kopierte den alten Kopf nach .git/ORIG_HEAD ; commit con -c ORIG_HEAD öffnet einen Editor, der zunächst die Protokollnachricht der alten Übergabe enthält und Ihnen erlaubt, sie zu bearbeiten. Wenn Sie die Nachricht nicht bearbeiten müssen, können Sie die Funktion -C Option.

Alternativ können Sie auch die vorherige Übergabe (oder nur die Übergabemeldung) bearbeiten , commit --amend fügt Änderungen innerhalb des aktuellen Indexes zur vorherigen Übertragung hinzu.

So entfernen Sie einen Commit, der auf den Server übertragen wurde (ohne ihn rückgängig zu machen) Umschreiben der Geschichte mit git push origin main --force[-with-lease] notwendig ist. Es ist fast immer eine schlechte Idee zu verwenden --force ; bevorzugen --force-with-lease stattdessen, und wie in das Git-Handbuch :

Sie sollten die Auswirkungen des Umschreibens der Geschichte verstehen, wenn Sie [die Geschichte umschreiben] bereits veröffentlicht wurde.


Weitere Lektüre

Sie können verwenden git reflog zur Bestimmung des SHA-1 für den Commit, zu dem Sie zurückkehren möchten. Sobald Sie diesen Wert haben, verwenden Sie die oben beschriebene Befehlsfolge.


HEAD~ ist dasselbe wie HEAD~1 . Der Artikel Was ist der HEAD in Git? ist hilfreich, wenn Sie mehrere Übertragungen aufheben wollen.

12675voto

Ryan Lundy Punkte 195074

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.

2706voto

Andrew Punkte 210206

Es gibt zwei Möglichkeiten, Ihren letzten Commit rückgängig zu machen, je nachdem, ob Sie Ihren Commit bereits veröffentlicht haben oder nicht (in Ihr entferntes Repository gepusht):

Rückgängigmachen einer lokalen Übertragung

Angenommen, ich habe eine lokale Übertragung vorgenommen, möchte diese aber wieder entfernen.

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

Um alles wieder so herzustellen, wie es vor der letzten Übertragung war, müssen wir reset zur Übertragung vor HEAD :

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

Jetzt git log zeigt an, dass unsere letzte Übertragung entfernt wurde.

Rückgängig machen einer öffentlichen Übertragung

Wenn Sie Ihre Commits bereits veröffentlicht haben, sollten Sie einen neuen Commit erstellen, der die Änderungen des vorherigen Commits (des aktuellen HEAD) "rückgängig" macht.

git revert HEAD

Ihre Änderungen werden nun rückgängig gemacht und Sie können sie festschreiben:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Weitere Informationen finden Sie unter Git-Grundlagen - Dinge rückgängig machen .

1941voto

bdonlan Punkte 213545

Fügen Sie Dateien hinzu oder entfernen Sie sie, um die Dinge so zu gestalten, wie Sie es wünschen:

git rm classdir
git add sourcedir

Ändern Sie dann die Übergabe:

git commit --amend

Die vorherige, fehlerhafte Übertragung wird so bearbeitet, dass sie den neuen Indexstand widerspiegelt - mit anderen Worten, es ist so, als hätten Sie den Fehler gar nicht erst gemacht.

Beachten Sie, dass Sie dies nur tun sollten, wenn Sie noch nicht gepusht haben. Wenn Sie bereits gepusht haben, müssen Sie nur eine Korrektur normal übertragen.

1284voto

Lennart Koopmann Punkte 18919
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

または

git reset --hard HEAD~1

Warnung: Der obige Befehl entfernt dauerhaft die Änderungen an der Datei .java Dateien (und alle anderen Dateien), die Sie übertragen wollten.

Le site hard reset a HEAD-1 setzt Ihre Arbeitskopie auf den Stand des Commits vor Ihrem falschen Commit.

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