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

The git revert command is used for undoing changes to a repository's commit history. Other 'undo' commands like, git checkout and git reset, move the HEAD and branch ref pointers to a specified commit. Git revert also takes a specified commit, however, git revert does not move ref pointers to this commit. A revert operation will take the specified commit, inverse the changes from that commit, and create a new "revert commit". The ref pointers are then updated to point at the new revert commit making it the tip of the branch.

To demonstrate let’s create an example repo using the command line examples below:

$ 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 expects a commit ref was passed in and will not execute without one. Here we have passed in the HEAD ref. This will revert the latest commit. This is the same behavior as if we reverted to commit 3602d8815dbfa78cd37cd4d189552764b5e96c58. Similar to a merge, a revert will create a new commit which will open up the configured system editor prompting for a new commit message. Once a commit message has been entered and saved Git will resume operation. We can now examine the state of the repo using git log and see that there is a new commit added to the previous log:

$ 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.

Resetting vs. reverting

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: Die Operation 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 zum Befehl 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. 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.  

Summary

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.

Ready to learn git revert?

Sieh dir dieses interaktive Tutorial an.

Jetzt loslegen