Close

git revert

git revert ist ein Befehl, um einen Git-Commit rückgängig zu machen. 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 sich Änderungen des letzten Commits rückgängig machen lassen. 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.

Den Befehl "git revert" solltest du verwenden, wenn du bei deinem Projektverlauf den letzten Commit rückgängig machen 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.


Wie funktioniert "git revert"?


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"
[main (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"
[main 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"
[main 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
Git-Logo
Zugehöriges Material

Git-Merkzettel

Bitbucket-Logo
Lösung anzeigen

Git kennenlernen mit Bitbucket Cloud

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
[main 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, den letzten Commit rückgängig machen wird. Dasselbe Verhalten würden wir beobachten, wenn wir auf den Commit 3602d8815dbfa78cd37cd4d189552764b5e96c58 zurückgesetzt hätten. Wird ein Commit rückgängig gemacht, 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 dem Rückgängigmachen 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 Git-Commit zum Rückgängigmachen durchführst.

--no-edit

Das ist die Umkehrung der Option -e. Nach Eingabe des "git 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.

Commit rückgängig machen oder zurücksetzen?


Es ist wichtig zu verstehen, dass git revert einen einzelnen Commit rückgängig machen kann. 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".

Diagramm rückgängig machen oder zurücksetzen

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.


Diesen Artikel teilen
Nächstes Thema

Lesenswert

Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.

Mitarbeiter arbeiten mit unzähligen Tools zusammen

Bitbucket-Blog

Abbildung: DevOps

DevOps-Lernpfad

Demo Den: Feature-Demos mit Atlassian-Experten

So funktioniert Bitbucket Cloud mit Atlassian Open DevOps

Melde dich für unseren DevOps-Newsletter an

Thank you for signing up