W3docs

git revert

Lernen Sie den Befehl git revert kennen: Unterschied zu git reset, Optionen und Anwendungsbeispiele.

git revert

Diese Seite erklärt, was git revert tut, welche Optionen es akzeptiert, ein vollständiges Beispiel, wie es sich von git reset unterscheidet, wie ein Merge-Commit rückgängig gemacht wird und wie dabei entstehende Konflikte gelöst werden.

Beschreibung

Der Befehl git revert ist eine vorwärtsgerichtete Rückgängig-Operation. Anders als Befehle wie git reset schreibt er die Historie nicht um. Anstatt Commits zu löschen oder zu verschieben, berechnet er die Umkehrung der Änderungen, die ein Ziel-Commit eingeführt hat, und zeichnet diese Umkehrung als neuen Commit oben auf dem aktuellen Branch auf.

Da nichts aus der Historie entfernt wird, ist git revert der sichere Weg, Arbeit rückgängig zu machen, die bereits in ein geteiltes Repository gepusht wurde: Jeder, der den ursprünglichen Commit besitzt, behält ihn, und das Revert fügt einfach einen Folge-Commit hinzu, der ihn aufhebt. Dadurch wird die vollständige Revisionshistorie bewahrt, was für Nachvollziehbarkeit und saubere Zusammenarbeit wichtig ist.

Einige Dinge sind zu beachten:

  • Ein Revert benötigt eine Commit-Referenz, um zu wissen, was rückgängig gemacht werden soll. Das Ausführen von git revert ohne Argument schlägt fehl.
  • Ein Revert hinterlässt den Arbeitsbaum in dem Zustand, der vorläge, wenn dieser Commit nie stattgefunden hätte (relativ zu den umgebenden Commits) – nicht unbedingt ein leerer Diff, da spätere Commits möglicherweise dieselben Zeilen betreffen.
  • Das Rückgängigmachen eines Reverts wendet die ursprüngliche Änderung erneut an, da die Umkehrung einer Umkehrung das Original ergibt.

Wann git revert verwendet werden sollte

Greifen Sie zu git revert, wenn:

  • Der Commit, den Sie rückgängig machen möchten, bereits veröffentlicht wurde (gepusht, in einem Pull Request geöffnet oder von Teammitgliedern gepullt).
  • Sie einen einzelnen bestimmten Commit irgendwo in der Mitte der Historie rückgängig machen möchten, ohne die danach folgenden Commits zu berühren.
  • Sie ein nachvollziehbares Protokoll benötigen, dass eine Änderung absichtlich rückgängig gemacht wurde.

Bevorzugen Sie git reset, wenn der Commit lokal und unveröffentlicht ist und Sie ihn einfach entfernen möchten, oder git commit --amend, wenn Sie nur den letzten (nicht gepushten) Commit korrigieren müssen.

Optionen

-e --editÖffnet den konfigurierten Systemeditor und fordert Sie auf, die Commit-Nachricht vor dem Committen des Reverts zu bearbeiten. Standardoption.
--no-editVerhindert, dass der Revert den Editor öffnet (das Gegenteil der -e-Option).
-n --no-commitFügt die umgekehrten Änderungen dem Staging Index und dem Arbeitsverzeichnis hinzu, anstatt einen neuen Commit zu erstellen.
-m <parent-number>Gibt beim Rückgängigmachen von Merge-Commits den Eltern-Commit an, gegen den revertiert werden soll.

Beispiele

# Stage the reverted changes without committing them (useful for review)
git revert -n HEAD

# Revert a merge commit against its first parent
git revert -m 1 <merge-commit-hash>

Funktionsweise

Wie git checkout und git reset nimmt auch git revert einen angegebenen Commit entgegen, verschiebt aber keine Referenzzeiger auf diesen Commit. Die Revert-Operation nimmt den angegebenen Commit, kehrt die Änderungen dieses Commits um und erstellt einen neuen Revert-Commit.

Hier ist ein Beispiel für die Erstellung eines Repositorys:

git revert Befehl

mkdir git_revert_example
cd git_revert_example/
git init .
#Initialized empty Git repository in /git_revert_example/.git/
touch w3docs_file
git add w3docs_file
git commit -m "original commit"
#[master (root-commit) 299b15f] original commit
#1 file changed, 0 insertions(+), 0 deletions(-)
#create mode 100644 w3docs_file
echo "original content" >> w3docs_file
git commit -m "add new content to w3docs_file"
#[master 3602d88] add new content to w3docs_file
#1 file changed, 1 insertion(+)
echo "prepended line content" >> w3docs_file
git commit -m "prepend content to w3docs file"
#[master 86bb32e] prepend content to w3docs file
#1 file changed, 1 insertion(+)
git log --oneline
#86bb32e prepend content to w3docs file
#3602d88 add new content to w3docs file
#299b15f original commit

In diesem Beispiel wird ein Repository in einem neu erstellten Verzeichnis namens git_revert_example initialisiert. Es gibt 3 Commits in das Repository, in denen eine Datei namens w3docs_file hinzugefügt wird. Der Inhalt wurde zweimal geändert. Wir verwenden git log am Ende der Repository-Einrichtung, um alle 3 Commits in der Commit-Historie anzuzeigen. Jetzt können wir git revert aufrufen:

git revert

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

git revert funktioniert nicht ohne Angabe einer Commit-Referenz. Im obigen Beispiel haben wir die HEAD-Referenz übergeben, um den letzten Commit rückgängig zu machen. Ein Revert erstellt einen neuen Commit und öffnet den konfigurierten Systemeditor, damit Sie die Nachricht bearbeiten können (übergeben Sie --no-edit, um die Standardnachricht zu akzeptieren). Wir können git log verwenden und sehen den neuen Commit, der oben auf der bisherigen Historie hinzugefügt wurde:

git log --oneline

git log --oneline
#b9cd081 Revert "prepend content to w3docs file"
#86bb32e prepend content to w3docs file
#3602d88 add new content to w3docs_file
#299b15f original commit

Nach dem Revert ist der „prepend"-Commit (86bb32e) immer noch in der Projekthistorie vorhanden. git revert hat einen neuen Commit (b9cd081) hinzugefügt, der dessen Änderungen rückgängig macht, anstatt ihn zu löschen. Das ist der wesentliche Unterschied zu git reset.

Rückgängig machen ohne Commit

Übergeben Sie -n (--no-commit), wenn Sie mehrere Commits in einem kombinierten Revert rückgängig machen möchten oder die umgekehrten Änderungen vor dem Aufzeichnen prüfen möchten. Git stagt die umgekehrten Änderungen, erstellt aber keinen Commit und überlässt Ihnen die Kontrolle:

# Stage the inverse of the last two commits, then commit once
git revert -n HEAD~1 HEAD
git status        # review the staged changes
git commit -m "Roll back the last two changes"

Wenn Sie mehr als einen Commit (oder einen Bereich) angeben, wendet Git für jeden einen Revert an. Ohne -n würde ein Commit pro Revert erstellt; mit -n werden sie in den einzelnen Commit zusammengefasst, den Sie selbst erstellen.

Einen Merge-Commit rückgängig machen

Ein Merge-Commit hat zwei Eltern, daher kann Git nicht selbst bestimmen, welche Seite Sie behalten möchten. Sie müssen mit -m <parent-number> angeben, welcher Elternteil die „Hauptlinie" darstellt, zu der zurückgekehrt werden soll. Elternnummern beginnen bei 1:

# Undo a merge, keeping the first parent (usually the branch you merged into)
git revert -m 1 <merge-commit-hash>

In einem typischen „Feature-Branch in main mergen"-Szenario ist Elternteil 1 main und Elternteil 2 der Feature-Branch, sodass -m 1 die Änderungen des Feature-Branchs verwirft.

Warnung

Das Rückgängigmachen eines Merges zeichnet auf, dass die gemergten Commits rückgängig gemacht wurden. Wenn Sie später versuchen, diesen Branch erneut zu mergen, wird Git diese Commits als bereits gemergt betrachten und sie überspringen. Um die Arbeit wieder einzuführen, müssen Sie in der Regel zuerst den Revert rückgängig machen. Bevorzugen Sie nach Möglichkeit das Rückgängigmachen einzelner Commits gegenüber dem Rückgängigmachen eines Merges.

Einen Revert-Konflikt lösen

Wenn spätere Commits dieselben Zeilen geändert haben, die der Revert rückgängig zu machen versucht, hält Git mit einem Konflikt an – genau wie ein Merge-Konflikt. Bearbeiten Sie die markierten Dateien, stagen Sie sie und schließen Sie dann den laufenden Revert ab:

git revert HEAD~2
# CONFLICT (content): Merge conflict in w3docs_file
# error: could not revert 4f2a1c0... change w3docs_file
# resolve the conflict markers in the file, then:
git add w3docs_file
git revert --continue   # records the revert commit

# Or, to back out of the whole operation:
git revert --abort

Reset vs. Revert

Der Befehl git revert macht einen Commit rückgängig, indem er einen neuen Commit hinzufügt, während git reset die Historie umschreibt, indem er den Branch-Zeiger zurückbewegt und die nachfolgenden Commits verwirft.

git revert

git revert1

Revert ist die sichere Wahl für Commits, die bereits in ein geteiltes Repository veröffentlicht wurden, und ermöglicht es, einen bestimmten Commit an beliebiger Stelle in der Historie zu betreffen. Vermeiden Sie git revert bei privaten, unveröffentlichten Commits, bei denen git reset einfacher und sauberer ist.

Verwandte Befehle

  • git reset — den Branch-Zeiger verschieben und spätere Commits verwerfen (historienschreibendes Rückgängigmachen).
  • git commit --amend — den letzten nicht gepushten Commit korrigieren.
  • git checkout — nicht committete Änderungen im Arbeitsbaum verwerfen.
  • git cherry-pick — die entgegengesetzte Operation: die Änderungen eines Commits auf den aktuellen Branch anwenden.

Übung

Übung
Was sind die Merkmale und Optionen des Befehls 'git revert'?
Was sind die Merkmale und Optionen des Befehls 'git revert'?
Was this page helpful?