Du willst Änderungen rückgängig machen, ohne die Projekthistorie umzuschreiben? Dann ist git revert das richtige Werkzeug. Im Gegensatz zu Befehlen wie git reset erstellt git revert einen neuen Commit, der die Änderungen eines früheren Commits invertiert. So bleibt die Historie nachvollziehbar und kollaboratives Arbeiten auf gemeinsamen Branches sicher.
Was git revert technisch macht
Kurz erklärt: git revert <commit> berechnet die Differenz (Patch), die ein früherer Commit eingeführt hat, kehrt diese um und erzeugt einen neuen Commit, der genau diese Umkehr enthält. Der ursprüngliche Commit bleibt in der Historie erhalten. Der Branchzeiger (HEAD) bewegt sich vorwärts – die Historie wird nicht neu geschrieben.
- Ein Commit hat eine Zeile hinzugefügt? Der Revert-Commit entfernt sie.
- Ein Commit hat eine Datei erstellt? Der Revert-Commit löscht sie wieder.
- Ein Commit hat eine Zeile geändert? Der Revert-Commit setzt die ursprüngliche Version wieder ein.
Merke:
git revertmacht keinen “Zeitsprung” zurück. Stattdessen erstellt es einen neuen, dokumentierten Schritt nach vorn, der die unerwünschte Änderung neutralisiert. Das ist der Grund, warum git revert commit auf Shared Branches (z. B.main) als sicher gilt.
git revert vs. git reset (und andere Undo-Befehle)
Viele verwechseln revert und reset. Die Unterschiede sind wesentlich für saubere Workflows:
| Aspekt | git revert | git reset | git restore / checkout | git cherry-pick |
|---|---|---|---|---|
| Wirkung auf Historie | Erstellt neuen Commit, der Änderungen umkehrt; Historie bleibt intakt | Verschiebt Branch-Zeiger; kann Historie umschreiben (riskant auf Shared Branches) | Setzt Dateien/Änderungen im Arbeitsverzeichnis zurück, ohne Commit-Historie zu ändern | Überträgt Änderungen eines Commits in den aktuellen Branch; kein Rückgängigmachen per se |
| Einsatzgebiet | Sicheres Rückgängigmachen bereits gepushter Commits | Lokales Umschreiben (z. B. letzten Commit korrigieren, vor Push) | Datei- oder Zeilenebene lokal reparieren | Gezielte Übernahme einzelner Commits |
| Team-Kompatibilität | Hoch – kollaborationssicher | Niedrig – historische Änderungen kollidieren mit Remotes | Neutral – lokal nützlich | Neutral – selektiver Transfer |
| Rückgängig gemachter Commit bleibt sichtbar? | Ja (plus der neue Revert-Commit) | Nein (kann nach reflog noch zu finden sein) |
Ja (keine Änderung an Historie) | Ja (neuer Commit mit gleichen Änderungen) |
Pragmatische Regel: Für bereits gepushte Commits nutze git revert. Für lokale Korrekturen vor dem Push ist git reset --soft/--mixed/--hard in Ordnung – sofern du weißt, was du tust.

Syntax und häufige Anwendungsfälle
Die Basissyntax ist geradlinig:
git revert <commit-hash>
- Letzten Commit rückgängig machen:
git revert HEAD - Einen spezifischen Commit revertieren:
git log --oneline --decorate --graph git revert 4945db2 - Mehrere Commits in einem Bereich:
# Revertiert die letzten drei Commits, erzeugt aber für jeden einen eigenen Revert-Commit git revert HEAD~3..HEADHinweis: Git verarbeitet die Commits der Reihe nach und erzeugt jeweils einen Revert-Commit. Bei Abhängigkeiten oder Überschneidungen können Konflikte auftreten.
- Mehrere Commits sammeln und in einem Commit zusammenfassen:
# Änderungen aus mehreren Reverts anwenden, aber noch nicht committen git revert --no-commit <hash1> <hash2> <hash3> # Danach alles in einem Commit festhalten git commit -m "Revert: Rolle A, B und C zusammengeführt"
Wichtige Optionen: schnell im Überblick
| Option | Beschreibung | Typischer Einsatz |
|---|---|---|
-e / --edit |
Öffnet den Editor, um die Commit-Nachricht zu bearbeiten (Standardverhalten im Terminal) | Wenn du die generierte Nachricht präzisieren willst |
--no-edit |
Nimmt die automatisch erzeugte Commit-Nachricht ohne Editor an | Skripting, Automatisierung, schnelle Reverts |
-n / --no-commit |
Wendet die invertierten Änderungen an, erstellt aber noch keinen Commit | Mehrere Reverts in einem Commit zusammenfassen; Konflikte in Ruhe lösen |
-m <parent-number> / --mainline |
Erforderlich für Merge-Commits; wählt den Elternteil aus, relativ zu dem reverted wird (1-basiert) | Wenn du einen Merge-Commit revertieren möchtest |
--continue |
Führt einen unterbrochenen Revert-Fortsetzungsprozess nach Konfliktlösung fort | Nach manueller Konfliktlösung |
--abort |
Bricht den laufenden Revert ab und stellt den vorherigen Zustand wieder her | Wenn die Situation zu komplex ist oder du neu starten möchtest |
Merge-Commits sicher rückgängig machen
Das Rückgängigmachen von Merges ist speziell: Ein Merge hat mehrere Eltern. Git muss wissen, relativ zu welchem Elternteil die Änderungen zurückgenommen werden sollen. Genau dafür gibt es -m (Mainline Parent).
- Typischer Fall: Du bist auf
mainund willst einen Merge-Commit rückgängig machen, der einen Feature-Branch eingebracht hat. Dann ist die Mainline üblicherweise der erste Elternteil:git revert -m 1 <merge-commit-hash> - Alternative: Stehst du auf dem Feature-Branch und willst relativ zu diesem zurücksetzen, kann
-m 2korrekt sein (abhängig von der Merge-Richtung).
Best Practice: Prüfe mit git show <merge-commit>, welche Eltern (Parent 1, Parent 2, …) beteiligt sind. Parent 1 ist in der Regel der Branch, in den gemergt wurde.
Hinweis: Ohne
-mverweigert Git den Revert eines Merge-Commits mit einer Fehlermeldung wie „is a merge but no -m option given“. Wähle den Mainline-Elternteil bewusst, um die semantisch korrekte Umkehr zu erzielen.

Konflikte beim Revert behandeln
Konflikte sind normal, wenn sich Änderungen überschneiden – etwa bei Serien von Reverts oder bei abhängigen Commits. So gehst du vor:
- Revert starten:
git revert HEAD~3..HEAD - Konflikte prüfen:
git status - Konflikte manuell lösen: Öffne die Dateien, bereinige die Konfliktmarkierungen
<<<<<<,=======,>>>>>>. - Gelöste Dateien markieren:
git add <datei1> <datei2> ... - Revert fortsetzen:
git revert --continue - Falls nötig abbrechen:
git revert --abort
Tipp: Bei mehreren geplanten Reverts nutze zuerst --no-commit, löse alle Konflikte in einem Rutsch und committe dann einmalig. Das minimiert Lärm in der Historie.
Fortgeschrittene Techniken
1) Gestapelte Reverts mit --no-commit
Wenn du viele Commits zurücknehmen möchtest, ist es oft besser, alle Reverts zu sammeln und am Ende nur einen Commit zu erstellen. So bleibt die Historie aufgeräumt.
# Änderungen anwenden, aber noch kein Commit
git revert --no-commit A B C D
# Konflikte lösen, testen, dann ein Commit
git commit -m "Revert: Entfernt A, B, C, D (stabilisiert Build)"
2) Einen Revert rückgängig machen (“Revert eines Reverts”)
Hast du versehentlich zu viel zurückgenommen oder musst eine Änderung wiederherstellen, ist der einfachste Weg: den Revert-Commit selbst revertieren.
# Angenommen, R ist der Revert-Commit
git revert R
Dadurch werden die ursprünglich entfernten Änderungen erneut eingeführt (sofern die Codebasis nicht weiter divergiert ist). Diese Technik ist nützlich, wenn ein Feature vorübergehend zurückgerollt wurde und später wieder aktiviert werden soll.
3) Bereiche revertieren
Für Sequenzen bietet sich eine Bereichsangabe an:
# Revertiert alle Commits, die in HEAD enthalten, aber nicht in HEAD~3 sind
git revert HEAD~3..HEAD
Achtung: Reverts werden als eigenständige Commits nacheinander erzeugt (außer mit --no-commit). Bei Abhängigkeiten zwischen Commits können zusätzliche Konflikte entstehen. Plane Zeit für eine saubere Konfliktlösung ein.
4) Revert im Release- und Hotfix-Workflow
- Release stabilisieren: Ein fehlerhafter Patch im Release-Branch? Revertiere gezielt den problematischen Commit, lasse CI durchlaufen und liefere sofort einen Hotfix aus.
- Trunk-based Development: Feature-Flag entfernt zu früh? git revert commit ist der schnellste Weg, die Stabilität auf
mainzu wahren, bis eine saubere Korrektur vorliegt.
Best Practices für sauberes Reverting
- Bevor du revertierst: Verstehe, was der Ziel-Commit genau verändert hat:
git show <hash> git diff <hash>^! # Patch eines einzelnen Commits - Klarer Commit-Text: Erkläre das “Warum”, nicht nur das “Was”.
- Beispiel: “Revert 4945db2 (Fix: API-Timeout), da Regression in Billing (#12345)”
- Tests ausführen: Nach jedem Revert: Unit-, Integrations- und E2E-Tests laufen lassen. Reverts können Seiteneffekte haben.
- Konflikte bewusst lösen: Nutze
git status,git mergetoolund prüfe betroffene Bereiche manuell. - Merge-Reverts mit Bedacht:
-mkorrekt wählen und Parent-Beziehungen prüfen (git show). - Serienreverts bündeln:
--no-commitnutzen, um am Ende nur einen Commit zu erzeugen. - Auf Shared Branches nie
reset --hard: Nutze stattdessengit revert, um die Historie zu bewahren. - Kommunikation: Wenn du in einem Team arbeitest, informiere kurz über Reverts – besonders bei produktionsrelevanten Änderungen.
Häufige Fehlerbilder und ihre Lösung
- “is a merge but no -m option given”
- Ursache: Du versuchst, einen Merge-Commit zu revertieren, ohne den Mainline-Elternteil zu spezifizieren.
- Lösung:
git show <merge-hash> # Eltern prüfen git revert -m 1 <merge-hash>
- “CONFLICT (content): Merge conflict”
- Ursache: Überschneidungen mit anderen Änderungen.
- Lösung: Dateien bereinigen,
git addauflösen, danngit revert --continue. Falls nötig:git revert --abort.
- Falscher Commit-Hash
- Lösung: Mit
git log --onelineodergit reflogden korrekten Hash ermitteln. Für die letzten Commits istHEAD~Noft praktischer.
- Lösung: Mit
- Revert führt zu instabilem Build
- Ursache: Commit hatte implizite Abhängigkeiten.
- Lösung: Zusätzliche Commits revertieren oder gezielte Fixes nachziehen. Tests ausweiten.
- Zu viele Revert-Commits in der Historie
- Ursache: Viele Einzel-Reverts hintereinander.
- Lösung: In Zukunft
--no-commitnutzen und Sammel-Commits bauen. Alternativ einen technischen “Cleanup”-Commit ergänzen, der Dokumentation/Kommentare bereinigt.
Praxisnahe Workflows: Schritt für Schritt
1) Den letzten Commit zurücknehmen (schnell und sicher)
# Überblick verschaffen
git log --oneline -n 3
# Letzten Commit revertieren
git revert HEAD
# Änderungen prüfen, Tests laufen lassen, pushen
git push origin <branch>
2) Einen bestimmten Commit in der Vergangenheit revertieren
# Commit finden
git log --oneline --decorate --graph --all | grep "Keyword" -n
# Revert durchführen
git revert 4945db2
# Falls Editor öffnet: Nachricht anpassen (Warum revertiert?), speichern, schließen
3) Mehrere Commits rückgängig, ein Commit erzeugen
# Reverts sammeln
git revert --no-commit abc123 def456 789abc
# Konflikte lösen
git status
# betroffene Dateien editieren, dann:
git add <datei> [...]
# Commit erstellen
git commit -m "Revert: Rollback mehrerer Commits wegen unerwarteter Seiteneffekte"
git push
4) Einen Merge-Commit revertieren
# Merge-Commit und Eltern prüfen
git show <merge-hash>
# Typischerweise auf main: Parent 1 ist der Mainline
git revert -m 1 <merge-hash>
# Bei Konflikten:
# - lösen, add, --continue
# - oder --abort
5) Revert eines Reverts (Änderungen wiederherstellen)
# Revert-Commit identifizieren
git log --oneline | grep "Revert"
# Revert-Commit revertieren
git revert <revert-hash>
# Ergebnis testen, pushen
git push
Schnellübersicht: Entscheidungsbaum
- Commit schon gepusht?
- Ja →
git revert - Nein →
git reset --soft/--mixed/--hard HEAD~1(je nach Bedarf) odergit revert
- Ja →
- Viele Commits revertieren? →
git revert --no-commit ...und dann ein einzigergit commit. - Merge-Commit revertieren? →
git revert -m <parent> <merge-hash>. - Konflikte? → manuell lösen →
git add→git revert --continueoder--abort.
Qualitätssicherung nach dem Revert
- Build und Tests: CI/CD laufen lassen, lokal Unit-/Integrationstests ausführen.
- Review: Kurzer PR mit Beschreibung, warum der Revert notwendig war; Link zu Ticket/Incident.
- Monitoring: Nach Deploy KPIs prüfen (Error-Rates, Latenzen, Business-Metriken).
- Nacharbeit: Root Cause Analysis (RCA) und ggf. Follow-up-Issue für saubere Korrektur erstellen.
Commit-Nachrichten: Beispiele, die helfen
Gute Revert-Kommentare sparen deinem Team Zeit. Muster:
- Titel: Revert abc123: Fix Timeout-Handling für Payment-API
- Kern: Dieser Revert setzt Commit abc123 zurück, da er in Stage eine erhöhte Fehlerrate verursacht. Siehe Incident #4567. Rollforward folgt mit Testabdeckung.
- Optional: Link zu Issue, Ticket, PR, Incident.
Grenzen und Stolpersteine
- Reverts sind keine selektiven Teil-Commits:
git revertrichtet sich immer an ganze Commits, nicht an einzelne Dateien oder Hunks dieses Commits. Für feinere Korrekturen:git restore -poder manuelles Editieren nach--no-commit. - Kaskadierende Abhängigkeiten: Wenn Commit B auf A aufbaut, kann der Revert von A Probleme schaffen. In solchen Fällen beide Commits revertieren oder gezielt refactoren.
- Alte Merges: Das Revertieren sehr alter Merge-Commits kann konfliktträchtig sein. Plane Zeit ein und arbeite in einem separaten Branch.
Fazit
git revert ist das robuste, kollaborative Werkzeug, um Änderungen sicher rückgängig zu machen, ohne die Historie zu beschädigen. Es erstellt einen klar dokumentierten, neuen Commit, der die Änderungen eines früheren Commits invertiert. Ob einzelner Bugfix, zurückzurollendes Feature oder ganzer Merge: Mit den richtigen Optionen (--no-commit, --no-edit, -m) und einer sauberen Konfliktstrategie behältst du die Kontrolle. Nutze git revert commit für alles, was bereits gepusht ist – und halte deine Historie transparent, nachvollziehbar und teamfreundlich.
FAQ
- Was ist der grundlegende Unterschied zwischen
git revertundgit reset? git reverterstellt einen neuen Commit, der eine frühere Änderung rückgängig macht, ohne die Historie zu verändern.git resetverschiebt den Branch-Zeiger und kann Historie umschreiben – gut für lokale Änderungen vor dem Push, riskant auf Shared Branches.- Wann sollte ich git revert commit verwenden?
- Immer dann, wenn ein unerwünschter Commit bereits gepusht wurde oder wenn du in einem Team auf einem geteilten Branch arbeitest. So bleibt die Historie konsistent und Konflikte mit Remotes werden vermieden.
- Wie revertiere ich mehrere Commits auf einmal?
- Entweder als Bereich, z. B.
git revert HEAD~3..HEAD(ein Revert-Commit pro Ziel-Commit), oder gesammelt mitgit revert --no-commit <hash1> <hash2> ...plus anschließendemgit commit. - Wie revertiere ich einen Merge-Commit?
- Mit
git revert -m <parent> <merge-hash>. Der parent gibt an, relativ zu welchem Elternteil die Umkehr erfolgen soll (meist-m 1auf dem Ziel-Branch des ursprünglichen Merges). - Was mache ich bei Konflikten während des Reverts?
- Konfliktstellen in den Dateien bereinigen,
git addausführen, danngit revert --continue. Wenn du abbrechen willst:git revert --abort. - Kann ich einen Revert rückgängig machen?
- Ja. Revertiere den Revert-Commit selbst:
git revert <revert-hash>. Das bringt die ursprünglichen Änderungen wieder zurück (sofern keine neuen Konflikte entstehen). - Wie finde ich den richtigen Commit-Hash?
- Mit
git log --oneline --decorate --graphoder – wenn du schon verschoben hast –git reflog. - Ist
git revertlangsamer oder riskanter alsreset? - Nein.
git revertist der sichere Weg für Shared Branches. Es ist nicht riskanter, nur bewusster: Du dokumentierst das Rückgängigmachen als eigenen Commit. - Kann ich selektiv nur Teile eines Commits revertieren?
- Nicht direkt mit
git revert. Du kannst abergit revert --no-commit <hash>ausführen, händisch anpassen (Dateien/Zeilen), danngit addundgit commit. - Warum sehe ich nach dem Revert den ursprünglichen Commit noch?
- Weil
git revertdie Historie nicht umschreibt. Es fügt nur einen neuen Commit hinzu, der die Änderung umkehrt. Das ist gewollt und erhöht die Nachvollziehbarkeit.
