Einführung
Änderungen und Commits in Git rückgängig machen mit checkout, restore, reset, revert, clean und amend — mit klaren Beispielen.

Anders als die meisten Editoren besitzt Git keine einzelne „Rückgängig"-Schaltfläche. Stattdessen bietet es eine kleine Auswahl an Befehlen, die jeweils auf einen anderen Ort abzielen, an dem Ihre Arbeit gespeichert ist: das Arbeitsverzeichnis (die Dateien auf der Festplatte), den Staging-Index (für den nächsten Commit vorgemerkte Änderungen) und die Commit-Historie (bereits aufgezeichnete Snapshots). Die Wahl des richtigen Befehls hängt davon ab, welchen dieser drei Bereiche Sie zurücksetzen möchten und ob die Änderung bereits mit anderen geteilt wurde.
Diese Seite behandelt das gesamte Werkzeugset: die Geschichte überprüfen, Dateien wiederherstellen und einen oder mehrere Commits rückgängig machen — mit git checkout, git restore, git reset, git revert, git clean und git commit --amend.
Den richtigen Befehl wählen
Bevor Sie einen konkreten Befehl einsetzen, ist es hilfreich zu wissen, welchen Bereich er betrifft und ob er die Geschichte umschreibt:
| Ziel | Befehl | Sicher zum Teilen? |
|---|---|---|
| Bearbeitungen einer versionierten Datei verwerfen | git restore <file> (oder git checkout -- <file>) | ja |
| Eine Datei aus dem Staging entfernen | git restore --staged <file> (oder git reset HEAD <file>) | ja |
| Nicht-versionierte Dateien löschen | git clean | ja |
| Den letzten Commit korrigieren | git commit --amend | nur wenn noch nicht gepusht |
| Den Branch auf einen älteren Commit zurücksetzen | git reset | nur lokal |
| Einen Commit durch einen inversen Commit aufheben | git revert | ja |
Die wichtigste Regel: reset und amend schreiben die Geschichte um — verwenden Sie sie daher nur bei Commits, die Sie noch nicht gepusht haben. Für alles, was bereits geteilt wurde, nutzen Sie revert.
Alte Commits überprüfen
Sie können nichts rückgängig machen, was Sie nicht finden können. Das beste Werkzeug zum Überprüfen der Geschichte ist git log. Jeder Commit hat einen eindeutigen Hash, mit dem Sie auf ihn verweisen:
git log --oneline
a3b2a21 Crossword solver with Vue.js
c54ce02 New logic for crossword game
3acb8d0 Some changes in crossword logic
de32112 Styling crossword table areaStandardmäßig zeigt git log nur die Commits an, die vom aktuellen Branch aus erreichbar sind. Um Commits aller Branches anzuzeigen, fügen Sie --all hinzu. Mit git checkout oder git switch wechseln Sie zu anderen Branches.
Eine alte Revision ansehen
Um das Projekt so zu untersuchen, wie es zu einem früheren Zeitpunkt aussah, suchen Sie zunächst den Hash der gewünschten Revision:
git log --oneline
b7119f2 Changes in Scrabble Solver
234be24 Fixing search input bug
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changesDann checken Sie diesen Commit anhand seines Hash aus:
git checkout b235bf4Sie können nun Dateien durchsuchen, Tests ausführen und sogar Änderungen vornehmen. Nichts, was Sie hier tun, wird auf einem Branch aufgezeichnet, sodass Ihre aktuelle Arbeit sicher bleibt. Dieser temporäre Zustand wird als detached HEAD bezeichnet — HEAD zeigt direkt auf einen Commit statt auf eine Branch-Spitze. Kehren Sie zum Abschluss zu Ihrem Branch zurück:
git switch - # or: git checkout masterSobald Sie wieder auf Ihrem Branch sind, können Sie mit git revert oder git reset jede gewünschte Änderung rückgängig machen.
Einen committeten Snapshot rückgängig machen
Es gibt mehrere Möglichkeiten, einen Commit rückgängig zu machen. Die richtige hängt davon ab, ob der Commit bereits geteilt wurde. Angenommen, unsere Geschichte sieht so aus:
git log --oneline
863fa8e Making some improvements
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changesDie folgenden Abschnitte machen den Commit 863fa8e Making some improvements auf drei verschiedene Arten rückgängig.
Mit git checkout (inspizieren ohne den Branch zu verändern)
Das Auschecken des vorherigen Commits b235bf4 versetzt das Repository in den Zustand vor dem Improvements-Commit:
git checkout b235bf4Dies ist ein schreibgeschützter Umweg, kein echtes Rückgängigmachen: Sie landen in einem losgelösten HEAD-Zustand. Jeder neue Commit, den Sie hier erstellen, wird verwaist, sobald Sie zu einem bestehenden Branch zurückwechseln, und Gits Garbage Collector kann ihn schließlich entfernen. Um Arbeit aus diesem Zustand zu behalten, erstellen Sie einen Branch davon:
git checkout -b improvements-removedSie haben jetzt einen neuen Branch, improvements-removed, dessen Verlauf nie 863fa8e enthielt. Checkout eignet sich am besten zum Betrachten eines alten Zustands; die nächsten beiden Befehle machen den Commit tatsächlich rückgängig.
Mit git revert (das sichere, teilbare Rückgängigmachen)
git revert HEAD erstellt einen neuen Commit, der das Inverse des Ziel-Commits anwendet. Es wird nichts gelöscht — die Geschichte wächst nach vorne:
git revert HEADNach der Ausführung sieht das Log so aus:
git log --oneline
23a4b42 Revert "Making some improvements"
863fa8e Making some improvements
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changesDie Auswirkung von 863fa8e ist nun aufgehoben, der Commit ist aber noch in der Geschichte vorhanden; 23a4b42 kehrt seine Änderungen einfach um. Da nichts umgeschrieben wird, bleiben Sie auf demselben Branch und beeinträchtigen niemand anderen. Dies ist das richtige Rückgängigmachen für Commits, die bereits gepusht oder öffentlich geteilt wurden.
Mit git reset (lokale Geschichte umschreiben)
git reset verschiebt den aktuellen Branch-Zeiger auf einen gewählten Commit. Die Ausführung von git reset --hard b235bf4 spult den Branch auf diesen Commit zurück und verwirft alles danach:
git reset --hard b235bf4
git log --oneline
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changesDer Commit 863fa8e ist aus der Geschichte dieses Branches verschwunden. Das ist klar und direkt, aber da es die Geschichte umschreibt, dürfen Sie es nur bei Commits tun, die Sie noch nicht gepusht haben. git reset akzeptiert ein Modus-Flag, das steuert, wie weit das Rückgängigmachen reicht:
--soft— nur den Branch-Zeiger verschieben; Änderungen bleiben im Staging.--mixed(Standard) — den Zeiger verschieben und Änderungen aus dem Staging entfernen, aber im Arbeitsverzeichnis behalten.--hard— den Zeiger verschieben und alle Änderungen im Staging und Arbeitsverzeichnis verwerfen.
git reset --hard verwirft nicht committete Arbeit im Arbeitsverzeichnis dauerhaft. Es gibt keine Staging-Stufe, von der aus sie wiederhergestellt werden kann. Verwenden Sie --soft oder --mixed, wenn Sie nur den Commit wiederholen, die Bearbeitungen aber behalten möchten.
Den letzten Commit rückgängig machen
Manchmal möchten Sie den letzten Commit nicht entfernen — Sie haben nur zu früh committet oder eine schlechte Nachricht geschrieben. Stellen Sie weitere Änderungen mit git add bereit und amenden Sie dann:
git add forgotten-file.txt
git commit --amendGit öffnet Ihren konfigurierten Editor, damit Sie die Nachricht des letzten Commits bearbeiten können, und die neu bereitgestellten Änderungen werden in denselben Commit eingefügt. Um nur die Nachricht in einer Zeile zu ändern:
git commit --amend -m "A clearer message"Amending ersetzt den vorherigen Commit durch einen neuen (mit neuem Hash), behandeln Sie es also wie reset: amenden Sie nur Commits, die Sie noch nicht gepusht haben.
Uncommittete Änderungen rückgängig machen
Bevor eine Änderung committet wird, befindet sie sich im Arbeitsverzeichnis und im Staging-Index, sodass Sie sie aus beiden Bereichen rückgängig machen können, ohne die Geschichte zu berühren. Der moderne Befehl ist git restore:
# Discard edits to a tracked file (working directory)
git restore <file>
# Unstage a file but keep its edits
git restore --staged <file>Die älteren Entsprechungen funktionieren noch und erscheinen in vielen Dokumentationen:
# Discard changes in the working directory
git checkout -- <file>
# Unstage a file
git reset HEAD <file>Nicht-versionierte Dateien entfernen
git restore und reset betreffen nur Dateien, die Git bereits kennt. Um brandneue, nicht-versionierte Dateien zu löschen, verwenden Sie git clean. Überprüfen Sie immer zuerst mit -n (Probelauf):
git clean -n # list what would be removed
git clean -f # actually remove untracked filesWie die drei Bereiche zusammenhängen
Es lohnt sich, die drei Bereiche im Kopf zu behalten, da jeder Rückgängig-Befehl auf einen bestimmten abzielt:
- Arbeitsverzeichnis — die Dateien auf der Festplatte, die Ihr Editor ändert.
git restore <file>undgit cleanwirken hier. - Staging-Index — der Snapshot, den Sie für den nächsten Commit aufbauen.
git addlegt Änderungen hier ab;git restore --staged(ein--mixed-Reset) schiebt sie zurück ins Arbeitsverzeichnis. - Commit-Historie — aufgezeichnete Snapshots.
git resetschreibt sie um;git revertfügt ihr Neues hinzu.
Von einem versehentlichen Rückgängigmachen erholen
Ein Reset oder ein gelöschter Branch kann beängstigend wirken, aber Git verliert selten sofort etwas. Das git reflog zeichnet auf, wohin HEAD gezeigt hat, sodass Sie den Hash eines „verlorenen" Commits finden und dorthin zurücksetzen können:
git reflog
1a2b3c4 HEAD@{0}: reset: moving to b235bf4
863fa8e HEAD@{1}: commit: Making some improvementsStellen Sie mit git reset --hard 863fa8e wieder her (oder erstellen Sie einen Branch davon). Wenn Sie Arbeit nur vorübergehend beiseitelegen möchten statt sie rückgängig zu machen, ziehen Sie stattdessen git stash in Betracht.
Öffentliche Änderungen rückgängig machen
Sobald ein Commit gepusht wurde, haben ihn möglicherweise andere. Verwenden Sie git revert für öffentliche Änderungen, niemals git reset. Reset entfernt Commits aus der Geschichte, sodass das Umschreiben eines geteilten Branches alle anderen zwingt, ihre Klone zu reparieren. Revert lässt den ursprünglichen Commit bestehen und zeichnet einen neuen Commit auf, der ihn umkehrt — sicher für alle, die bereits gepullt haben.