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