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
Zugehöriges Material
Git-Merkzettel
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".
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.