Der Befehl git revert ist ein Befehl zum Rückgängigmachen. Der Vorgang, der dahintersteckt, ist jedoch nicht wie bei einem herkömmlichen Rückgängigmachen. Anstatt den Commit aus dem Projektverlauf zu entfernen, wird ermittelt, wie durch den Commit bewirkte Änderungen umgekehrt werden können. Ein neuer Commit wird dann mit den entsprechenden umgekehrten Inhalten ergänzt. Somit wird verhindert, dass der Verlauf von Git verkürzt wird, was für die Integrität deines Überprüfungsverlaufs und für eine zuverlässige Zusammenarbeit wichtig ist.

Diesen Befehl zum Rückgängigmachen solltest du verwenden, wenn du einen Commit von deinem Projektverlauf umkehren möchtest. Das kann beispielsweise nützlich sein, wenn sich herausstellt, dass ein Bug durch einen ganz bestimmten Commit in das Projekt eingeführt wurde. Statt manuell zu dem entsprechenden Code zu navigieren, ihn zu korrigieren und einen neuen Snapshot zu committen, kannst du den gesamten Prozess mit git revert automatisch durchführen.

git revert: Git-Tutorials von Atlassian

Wie es funktioniert

Der Befehl git revert dient dazu, Änderungen am Commit-Verlauf eines Repositorys rückgängig zu machen. Andere Befehle zur Rückgängigmachung wie git checkout und git reset verschieben den HEAD und Branch-Ref-Pointer zu einem bestimmten Commit. git revert geht ebenfalls von einem bestimmten Commit aus, git revert verschiebt jedoch Ref-Pointer nicht zu diesem Commit. Beim Rückgängigmachen wird der spezifizierte Commit hergenommen, die Änderungen in diesem Commit umgekehrt und ein neuer Revert-Commit erstellt. Die Ref-Pointer werden anschließend aktualisiert, sodass sie auf den neuen Revert-Commit verweisen, der zur Spitze des Branch wird.

Führen wir uns das einmal mit einem Beispiel-Repository und folgenden Befehlszeilenbeispielen vor Augen:

$ mkdir git_revert_test $ cd git_revert_test/ $ git init . Initialized empty Git repository in /git_revert_test/.git/ $ touch demo_file $ git add demo_file $ git commit -am"initial commit" [master (root-commit) 299b15f] initial commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 demo_file $ echo "initial content" >> demo_file $ git commit -am"add new content to demo file" [master 3602d88] add new content to demo file n 1 file changed, 1 insertion(+) $ echo "prepended line content" >> demo_file $ git commit -am"prepend content to demo file" [master 86bb32e] prepend content to demo file 1 file changed, 1 insertion(+) $ git log --oneline 86bb32e prepend content to demo file 3602d88 add new content to demo file 299b15f initial commit

Hier haben wir ein Repository in einem neu erstellten Verzeichnis namens git_revert_test angelegt. Wir haben 3 Commits in dem Repository durchgeführt, wobei wir die Datei demo_file hinzugefügt und ihren Inhalt zweimal geändert haben. Am Schluss der Repository-Einrichtung lassen wir mit git log den Commit-Verlauf anzeigen und sehen, dass 3 Commits aufgezeichnet wurden. Im jetzigen Zustand des Repositorys können wir git revert ausführen.

 $ git revert HEAD [master b9cd081] Revert "prepend content to demo file" 1 file changed, 1 deletion(-)

git revert erwartet eine Commit-Ref. Ohne sie wird der Befehl nicht ausgeführt. Hier haben wir die Referenz HEAD angegeben, was den neuesten Commit rückgängig machen wird. Dasselbe Verhalten würden wir beobachten, wenn wir auf den Commit 3602d8815dbfa78cd37cd4d189552764b5e96c58 zurückgesetzt hätten. Beim Rückgängigmachen wird, ähnlich wie bei einem Merge, ein neuer Commit erstellt, der den konfigurierten Systemeditor öffnet. Dieser fordert zur Eingabe einer neuen Commit-Nachricht auf. Sobald diese eingegeben und gespeichert wurde, setzt Git den Betrieb fort. Wir können jetzt den Status des Repositorys mithilfe des Befehls git log untersuchen und sehen, dass dem vorherigen Protokoll ein neuer Commit hinzugefügt wurde:

 $ git log --oneline 1061e79 Revert "prepend content to demo file" 86bb32e prepend content to demo file 3602d88 add new content to demo file 299b15f initial commit

Wie du siehst, erscheint der 3. Commit auch nach der Rückgängigmachung noch im Projektverlauf. Statt ihn zu löschen, hat git revert einen neuen Commit hinzugefügt, der seine Änderungen rückgängig macht. Dadurch repräsentieren der 2. und der 4. Commit exakt dieselbe Codebasis und der 3. Commit ist immer noch im Verlauf verfügbar, falls er später noch einmal benötigt wird.

Allgemeine Optionen

 -e --edit

Das ist eine Standardoption, die nicht weiter ergänzt werden muss. Sie öffnet den konfigurierten Systemeditor und fordert dich zur Eingabe einer Commit-Nachricht auf, bevor du den Commit zum Rückgängigmachen durchführst.

 --no-edit

Das ist die Umkehrung der Option -e. Nach Eingabe des revert-Befehls wird der Editor nicht geöffnet.

 -n --no-commit

Wenn du diese Option eingibst, wird git revert daran gehindert, einen neuen Commit zu erstellen, der den Ziel-Commit umkehrt. Statt einen neuen Commit zu erstellen, werden mit dieser Option die rückgängig gemachten Änderungen zum Staging-Index und zum Arbeitsverzeichnis hinzugefügt. So heißen die anderen Bäume, die Git zur Zustandsverwaltung des Repositorys nutzt. Weitere Infos findest du auf der Seite git reset.

Zurücksetzen vs. Rückgängigmachen

Es ist wichtig zu verstehen, dass git revert einen einzelnen Commit rückgängig macht. Der Befehl stellt nicht den vorherigen Projektstatus wieder her, wobei alle nachfolgenden Commits entfernt werden würden. In Git wird dies eigentlich als "reset" bezeichnet, nicht als "revert".

git revert vs. git reset: Git-Tutorials von Atlassian

Eine Rückgängigmachung hat gegenüber einer Zurücksetzung zwei wichtige Vorteile. Zum einen bleibt der Projektverlauf unberührt: Der Vorgang hat keine Auswirkungen auf Commits, die bereits in einem freigegebenen Repository veröffentlicht wurden. Warum genau es so gefährlich ist, einen freigegebenen Verlauf zu verändern, kannst du auf der Seite git reset nachlesen.

Zum anderen kannst du git revert auf einzelne Commits an jedem beliebigen Punkt im Verlauf anwenden. git reset hingegen arbeitet ausschließlich rückwirkend ab dem aktuellen Commit. Nehmen wir an, du möchtest einen alten Commit mit git reset rückgängig machen. Dann müsstest du zunächst alle Commits entfernen, die nach dem Ziel-Commit durchgeführt wurden. Anschließend müsstest du den Ziel-Commit entfernen und alle nach ihm durchgeführten Commits erneut committen. Das ist natürlich keine sehr elegante oder praktikable Lösung. Ausführliche Erläuterungen zu den Unterschieden zwischen git revert und anderen Befehlen zum Rückgängigmachen findest du unter Zurücksetzen, Auschecken und Rückgängigmachen.

Zusammenfassung

Der Befehl git revert ist ein nach vorne gerichteter Vorgang und eine sichere Methode zum Rückgängigmachen von Änderungen. Das Rückgängigmachen mit "revert" hat den Vorteil, dass ein neuer Commit erstellt wird, um bestimmte Änderungen rückgängig zu machen. So werden keine Commits aus dem Commit-Verlauf gelöscht oder verwaisen. git revert ist im Vergleich zu git reset die sicherere Option, was den Verlust von Code betrifft. Um zu zeigen, was git revert bewirkt, haben wir weitere Befehle zu Hilfe genommen, die auf den entsprechenden Seiten detaillierter beschrieben sind: git log, git commit und git reset.

Möchtest du dich mit "git revert" vertraut machen?

Sieh dir dieses interaktive Tutorial an.

Jetzt loslegen