Änderungen in Git rückgängig machen: Reset, Restore, Revert erklärt

Verstehen Sie git restore, reset und revert, um Dateien zu entstagen, lokale Änderungen zu verwerfen, Commits rückgängig zu machen und das Umschreiben gemeinsamer Historie zu vermeiden.

Änderungen in Git rückgängig machen: Reset, Restore, Revert erklärt

Änderungen in Git rückgängig zu machen ist sicher, wenn Sie wissen, welche Ebene Sie ändern: den Arbeitsbaum, den Staging-Bereich oder die Commit-Historie. Die gängigen Befehle sind git restore, git reset und git revert, die unterschiedliche Probleme lösen.

Die große Regel ist einfach: Verwenden Sie restore für Dateien, reset für lokale Historie-Änderungen und revert für das Rückgängigmachen von Commits, die andere möglicherweise bereits haben.

Grundlegende Konzepte verstehen

Behalten Sie diese Bereiche im Blick:

  • Arbeitsbaum: die Dateien, die Sie bearbeiten.
  • Staging-Bereich, auch Index genannt: die für den nächsten Commit ausgewählten Änderungen.
  • Commit-Historie: die bereits aufgezeichneten Commits.
  • HEAD: der aktuelle Commit, auf den Ihr Branch zeigt.

Führen Sie git status aus, bevor Sie etwas rückgängig machen. Es zeigt Ihnen, ob Änderungen ungestaged, gestaged oder bereits committet sind.

git restore: Zum Verwerfen von Änderungen im Arbeitsverzeichnis und Staging-Bereich

Verwenden Sie git restore, wenn Sie Dateien im Arbeitsbaum oder Staging-Bereich ändern möchten, ohne die Branch-Historie zu verschieben.

Dateien entstagen

Wenn Sie eine Datei versehentlich gestaged haben, entstagen Sie sie mit --staged:

git restore --staged <datei>

Um alles zu entstagen:

git restore --staged .

Ihre Dateibearbeitungen bleiben im Arbeitsbaum erhalten. Sie werden lediglich aus dem nächsten Commit entfernt.

Änderungen im Arbeitsverzeichnis verwerfen

Um ungestagte Bearbeitungen in einer Datei zu verwerfen:

git restore <datei>

Dadurch wird die Kopie im Arbeitsbaum an den Index angeglichen. Wenn die Datei nicht gestaged ist, bedeutet das normalerweise, dass sie auf HEAD zurückgesetzt wird. Überprüfen Sie zuerst git diff, da dies lokale Bearbeitungen verwirft.

Um sowohl gestagte als auch ungestagte Änderungen für eine Datei zu verwerfen und sie von HEAD wiederherzustellen:

git restore --source=HEAD --staged --worktree <datei>

Wiederherstellen einer Datei aus einem bestimmten Commit

Sie können auch eine einzelne Datei aus einem älteren Commit zurückholen:

git restore --source=<commit> -- pfad/zur/datei

Dadurch wird die Datei in Ihrem Arbeitsbaum geändert. Committen Sie sie, wenn die alte Version das ist, was Sie zukünftig verwenden möchten.

git reset: Historie umschreiben

Verwenden Sie git reset, wenn Sie den aktuellen Branch-Zeiger verschieben möchten. Es kann je nach Modus auch den Staging-Bereich und den Arbeitsbaum ändern.

Die Modi verstehen (--soft, --mixed, --hard)

Die drei gängigen Modi sind:

git reset --soft HEAD^

Verschiebt HEAD um einen Commit zurück und behält die Änderungen des rückgängig gemachten Commits im Staging-Bereich.

git reset --mixed HEAD^

Verschiebt HEAD um einen Commit zurück und behält die Änderungen des rückgängig gemachten Commits ungestaged. --mixed ist die Standardeinstellung, daher macht git reset HEAD^ dasselbe.

git reset --hard HEAD^

Verschiebt HEAD um einen Commit zurück und verwirft entsprechende Änderungen aus dem Staging-Bereich und Arbeitsbaum. Dies ist destruktiv. Führen Sie es nicht leichtfertig aus.

Nützliche Reset-Muster:

git reset --soft HEAD^      # letzten lokalen Commit wiederholen, Änderungen gestaged lassen
git reset HEAD^             # letzten lokalen Commit rückgängig machen, Änderungen ungestaged lassen
git reset                   # alle gestagten Änderungen entstagen
git reset --hard origin/main # lokale Änderungen verwerfen und origin/main angleichen

Einen alten Commit zurücksetzen

Um Ihren Branch um zwei Commits zurückzusetzen, während die Änderungen in Ihrem Arbeitsbaum erhalten bleiben:

git reset --mixed HEAD~2

Setzen Sie nur Commits zurück, die lokal sind oder bei denen Ihr Team dem Umschreiben zugestimmt hat. Wenn die Commits bereits auf einem gemeinsamen Branch sind, bevorzugen Sie git revert.

git revert: Einen neuen Commit erstellen, um Änderungen rückgängig zu machen

git revert erstellt einen neuen Commit, der die Umkehrung eines früheren Commits anwendet. Es löscht oder verschiebt den ursprünglichen Commit nicht, daher ist es sicher für gemeinsame Branches.

Einen Commit revertieren:

git revert <commit-hash>

Einen Bereich revertieren:

git revert HEAD~3..HEAD

Wenn Konflikte auftreten, lösen Sie sie, stagen Sie die Dateien und fahren Sie fort:

git add <behobene-dateien>
git revert --continue

Das Revertieren eines Merge-Commits erfordert besondere Vorsicht, da Git wissen muss, welcher Elternteil als Hauptlinie behandelt werden soll:

git revert -m 1 <merge-commit>

Tun Sie dies nur, wenn Sie verstehen, was der Merge eingeführt hat. Fragen Sie bei Produktions-Branches vor dem Revertieren von Merges um eine Überprüfung.

Den richtigen Befehl wählen

Verwenden Sie diese Kurzanleitung:

  • Eine Datei entstagen: git restore --staged <datei>.
  • Ungestagte Bearbeitungen in einer Datei verwerfen: git restore <datei>.
  • Letzten lokalen Commit rückgängig machen und Änderungen gestaged lassen: git reset --soft HEAD^.
  • Letzten lokalen Commit rückgängig machen und Änderungen ungestaged lassen: git reset HEAD^.
  • Lokale Änderungen und Commits destruktiv verwerfen: git reset --hard <commit>.
  • Einen gepushten Commit sicher rückgängig machen: git revert <commit-hash>.

Praktische Zusammenfassung

Führen Sie vor dem Rückgängigmachen von etwas git status aus und entscheiden Sie, was Sie ändern. Verwenden Sie restore für die Bereinigung auf Dateiebene, reset für lokale, nicht gepushte Commits und revert für gemeinsame Historie. Wenn ein Befehl --hard enthält, halten Sie inne und überprüfen Sie zuerst git diff.