← Zurück zum Blog

Wie man einen Git-Commit rückgängig macht (ohne Arbeit zu verlieren)

tutorial git

Sie haben einen Commit gemacht, den Sie rückgängig machen wollen. Was nun?

Das passiert jedem. Sie committen zu früh, fügen eine Datei ein, die nicht hineingehört, schreiben die falsche Nachricht oder stellen fest, dass der Code einfach nicht stimmt. Die gute Nachricht: Git ist dafür gemacht, damit umzugehen. Die bessere Nachricht: In den meisten Fällen können Sie einen Commit rückgängig machen, ohne Ihre Arbeit zu verlieren.

Der richtige Ansatz hängt von einer Schlüsselfrage ab: Wurde der Commit bereits auf ein Remote gepusht, oder ist er noch lokal? Lokale Commits geben Ihnen mehr Flexibilität. Gepushte Commits erfordern eine sicherere Strategie, da andere Personen Ihre Änderungen möglicherweise bereits gepullt haben.

Einen lokalen Commit mit git reset rückgängig machen

Wenn der Commit noch lokal ist (nicht gepusht), ist git reset das gängigste Werkzeug. Es verschiebt den Branch-Zeiger auf einen früheren Commit zurück und macht damit den Commit effektiv rückgängig. Was mit den Änderungen passiert, hängt vom verwendeten Flag ab.

git reset --soft: Commit rückgängig machen, alles im Staging behalten

git reset --soft HEAD~1

Dies macht den letzten Commit rückgängig, behält aber alle Änderungen im Staging (im Index). Ihr Arbeitsverzeichnis bleibt unberührt. Es ist, als hätten Sie git commit nie ausgeführt -- Sie sind genau an dem Punkt vor dem Committen.

Wann verwenden: Sie möchten die Commit-Nachricht ändern, weitere Dateien zum Commit hinzufügen oder den Commit in kleinere aufteilen. Ihr Code ist in Ordnung, Sie haben nur zu früh committet.

git reset --mixed: Commit rückgängig machen, Änderungen aus dem Staging nehmen

git reset --mixed HEAD~1

Dies ist das Standardverhalten von git reset (Sie können das Flag --mixed weglassen). Es macht den Commit rückgängig und nimmt die Änderungen aus dem Staging, aber Ihre Dateien bleiben im Arbeitsverzeichnis modifiziert. Nichts geht verloren.

Wann verwenden: Sie möchten überdenken, was in den Commit aufgenommen werden soll. Vielleicht möchten Sie nur einige Dateien stagen oder die Änderungen vor dem erneuten Committen überprüfen.

git reset --hard: Commit rückgängig machen, alle Änderungen verwerfen

git reset --hard HEAD~1

Dies macht den Commit rückgängig und löscht dauerhaft alle Änderungen. Ihr Arbeitsverzeichnis wird zurückgesetzt, um dem vorherigen Commit zu entsprechen. Es gibt keine Möglichkeit, die verworfenen Änderungen über normale Git-Operationen wiederherzustellen.

Wann verwenden: Sie sind sicher, dass Sie die Änderungen überhaupt nicht wollen. Vielleicht haben Sie experimentellen Code committet, der nicht funktioniert hat, und Sie wollen einen sauberen Neuanfang. Verwenden Sie dies mit Vorsicht.

Weiter zurück gehen

HEAD~1 bezieht sich auf einen Commit vor dem aktuellen HEAD. Sie können weiter zurückgehen:

git reset --soft HEAD~3

Dies macht die letzten drei Commits rückgängig und fasst alle ihre Änderungen in der Staging-Area zusammen. Sie können auch einen bestimmten Commit über seinen Hash ansteuern:

git reset --soft a1b2c3d

Den letzten Commit mit git commit --amend korrigieren

Wenn Sie den letzten Commit nur anpassen müssen, statt ihn komplett rückgängig zu machen, ist --amend die schnellste Option:

git commit --amend -m "corrected commit message"

Dies ersetzt den vorherigen Commit durch einen neuen. Sie können es auch verwenden, um vergessene Dateien hinzuzufügen:

git add forgotten-file.ts
git commit --amend --no-edit

Das Flag --no-edit behält die ursprüngliche Commit-Nachricht bei. Das Ergebnis ist ein einzelner, korrigierter Commit statt einer Reihe von "Ups"-Commits.

Wichtig: Wie reset schreibt auch amend die Historie um. Verwenden Sie es nur für Commits, die noch nicht gepusht wurden. Wenn Sie einen gepushten Commit amendn und dann force-pushen, wird jeder, der den ursprünglichen Commit gepullt hat, Probleme haben.

Einen gepushten Commit mit git revert rückgängig machen

Sobald ein Commit auf ein geteiltes Remote gepusht wurde, sollten Sie die Historie nicht umschreiben. Andere Entwickler haben möglicherweise ihre Arbeit auf diesem Commit aufgebaut. Verwenden Sie stattdessen git revert:

git revert HEAD

Dies erstellt einen neuen Commit, der genau das Gegenteil des Ziel-Commits macht. Wenn der ursprüngliche Commit eine Zeile hinzugefügt hat, entfernt der Revert-Commit sie. Wenn er eine Datei gelöscht hat, stellt der Revert-Commit sie wieder her. Der ursprüngliche Commit bleibt in der Historie, und der Revert wird darauf aufgesetzt.

Wann verwenden: Jedes Mal, wenn Sie einen bereits gepushten Commit rückgängig machen müssen. Es ist sicher, weil es zur Historie hinzufügt, anstatt sie umzuschreiben.

Einen älteren Commit reverten

Sie können jeden Commit reverten, nicht nur den aktuellsten:

git revert a1b2c3d

Git wird versuchen, einen Revert-Commit zu erstellen, der nur die Änderungen dieses bestimmten Commits rückgängig macht. Wenn sich diese Änderungen mit nachfolgender Arbeit überschneiden, kann ein Konflikt entstehen, der manuell gelöst werden muss.

Mehrere Commits reverten

Um eine Reihe von Commits zu reverten:

git revert HEAD~3..HEAD

Dies erstellt individuelle Revert-Commits für jeden Commit im Bereich. Wenn Sie einen einzelnen Revert-Commit bevorzugen, fügen Sie das Flag --no-commit hinzu und committen manuell:

git revert --no-commit HEAD~3..HEAD
git commit -m "revert last 3 commits"

Die richtige Methode wählen

Situation Methode Was mit Ihren Änderungen passiert
Zu früh committet, will re-stagen git reset --soft HEAD~1 Änderungen bleiben im Staging
Zu früh committet, will überarbeiten git reset --mixed HEAD~1 Änderungen bleiben im Arbeitsverzeichnis
Etwas committet, das verworfen werden soll git reset --hard HEAD~1 Änderungen werden gelöscht
Commit-Nachricht korrigieren oder Datei hinzufügen git commit --amend Vorheriger Commit wird ersetzt
Gepushten Commit sicher rückgängig machen git revert HEAD Neuer Commit macht die Änderungen rückgängig

Von Fehlern erholen

Selbst wenn Sie git reset --hard verwenden und feststellen, dass Sie es nicht hätten tun sollen, gibt es oft einen Weg zur Wiederherstellung. Git führt ein Protokoll darüber, wohin HEAD gezeigt hat, das sogenannte reflog:

git reflog

Dies zeigt eine Liste der letzten HEAD-Positionen. Sie können den Commit finden, den Sie verloren glaubten, und dorthin zurückkehren:

git reset --hard HEAD@{2}

Das reflog ist Ihr Sicherheitsnetz. Einträge werden standardmäßig 90 Tage aufbewahrt, sodass Sie ein großzügiges Zeitfenster haben, um sich von Fehlern zu erholen.

Commits in GitSquid rückgängig machen

GitSquid vereinfacht die häufigsten Rückgängig-Operationen. Sie können Cmd+Z (oder Ctrl+Z unter Windows und Linux) unmittelbar nach dem Committen drücken, um den letzten Commit rückgängig zu machen, wobei Ihre Änderungen im Staging bleiben und zur Überarbeitung bereit sind. Für spezifischere Operationen gibt Ihnen ein Rechtsklick auf einen beliebigen Commit im Graphen Zugang zu Reset- und Revert-Optionen über ein Kontextmenü, sodass Sie genau den Commit ansteuern können, den Sie rückgängig machen möchten, ohne sich Flags merken zu müssen.

Einen Git-Commit rückgängig zu machen, muss nicht stressig sein. Verstehen Sie den Unterschied zwischen reset, amend und revert, wissen Sie, welches zu Ihrer Situation passt, und Sie können Fehler souverän beheben. Die wichtigste Unterscheidung ist einfach: Wenn es lokal ist, verwenden Sie reset oder amend. Wenn es gepusht ist, verwenden Sie revert.