Änderungen in Git rückgängig machen: Reset, Restore, Revert erklärt
Git ist ein leistungsstarkes Versionskontrollsystem, das es Ihnen ermöglicht, Änderungen an Ihrem Codebestand zu verfolgen. Fehler passieren jedoch, und Sie müssen möglicherweise Änderungen rückgängig machen. Git bietet mehrere Befehle, die dabei helfen, aber sie funktionieren sehr unterschiedlich und wirken sich auf unterschiedliche Weise auf Ihr Repository aus. Das Verständnis der Nuancen zwischen git reset, git restore und git revert ist entscheidend für die effektive Verwaltung der Historie Ihres Projekts und die Korrektur von Fehlern ohne unbeabsichtigte Konsequenzen.
Dieser Artikel wird diese drei Befehle entmystifizieren, ihren Zweck erklären, wie sie funktionieren und wann jeder davon verwendet werden sollte. Wir werden die offizielle Git-Dokumentation und gängige Nutzungsmuster nutzen, um klare Erklärungen und praktische Beispiele zu liefern. Am Ende dieser Anleitung werden Sie in der Lage sein, Änderungen selbstbewusst rückgängig zu machen, Ihre gestagten Dateien zu verwalten und eine saubere, kohärente Commit-Historie zu pflegen.
Die Kernkonzepte verstehen
Bevor wir uns mit den Befehlen befassen, ist es wichtig, einige Git-Konzepte zu verstehen:
- Arbeitsverzeichnis (Working Directory): Die Dateien, die Sie gerade bearbeiten.
- Staging-Bereich (Index): Ein Wartebereich, in dem Sie Änderungen vorbereiten, bevor Sie sie committen.
git addverschiebt Änderungen vom Arbeitsverzeichnis in den Staging-Bereich. - Commit-Historie: Eine zeitliche Abfolge von Schnappschüssen Ihres Projekts, dargestellt durch Commits.
- HEAD: Ein Zeiger auf den letzten Commit in Ihrem aktuellen Branch.
Diese drei Befehle interagieren hauptsächlich mit diesen Bereichen, um Änderungen zu modifizieren oder zu verwerfen.
git restore: Zum Verwerfen von Änderungen im Arbeitsverzeichnis und im Staging-Bereich
Der Befehl git restore, der neuer in Git eingeführt wurde, ist für die unkomplizierte Aufgabe gedacht, Änderungen in Ihrem Arbeitsverzeichnis rückgängig zu machen oder Dateien zu entstaggen. Für diese spezifischen Operationen gilt er im Allgemeinen als sicherer und intuitiver als git reset.
Dateien entstaggen
Wenn Sie versehentlich eine Datei mit git add gestaged haben und sie wieder entstaggen möchten, ist git restore der richtige Befehl. Er verschiebt die Änderungen vom Staging-Bereich zurück in Ihr Arbeitsverzeichnis, verwirft jedoch nicht die Modifikationen selbst.
-
Eine bestimmte Datei entstaggen:
bash git restore <file>
Dieser Befehl übernimmt die Version der Datei aus dem Index (Staging-Bereich) und legt sie zurück in den Index. Im Wesentlichen entfernt er die Datei aus dem Staging für den nächsten Commit, aber die Änderungen bleiben in Ihrem Arbeitsverzeichnis erhalten. -
Alle Dateien entstaggen:
Obwohl es kein direktesgit restore .gibt, um alles auf die Art zu entstaggen, wie esgit resetkann, würden Siegit restoretypischerweise auf einzelne Dateien anwenden oder es bei Bedarf in Verbindung mit anderen Befehlen verwenden. Der häufigste Anwendungsfall ist jedoch das Entstaggen spezifischer Dateien.
Änderungen im Arbeitsverzeichnis verwerfen
git restore kann auch verwendet werden, um alle ungestagten Änderungen im Arbeitsverzeichnis für eine bestimmte Datei zu verwerfen und sie auf die Version im Staging-Bereich (Index) oder den letzten Commit-Zustand zurückzusetzen.
-
Ungestagte Änderungen in einer Datei verwerfen:
bash git restore <file>
(Hinweis: Dieser Befehl kann je nach Kontext zwei Bedeutungen haben. Wenn er ohne--stagedverwendet wird, zielt er hauptsächlich auf den Arbeitsbaum ab. Wenn die Datei gestaged ist, wird sie entstaggt. Wenn die Datei im Arbeitsbaum geändert, aber nicht gestaged ist, wird die Arbeitsbaumdatei so zurückgesetzt, dass sie mit dem Index übereinstimmt.) -
Sowohl gestagte als auch ungestagte Änderungen für eine Datei verwerfen (auf HEAD zurücksetzen):
Um alle Änderungen (sowohl gestagte als auch ungestagte) für eine Datei vollständig zu verwerfen und sie auf den Zustand zurückzusetzen, in dem sie sich beimHEAD-Commit befand:
bash git restore --staged --worktree <file>
Dies ist ein leistungsstarker Befehl, der die Datei effektiv auf ihren letzten Commit-Zustand zurücksetzt.
Eine Datei aus einem bestimmten Commit wiederherstellen
git restore kann auch die Version einer bestimmten Datei aus einem früheren Commit abrufen, ohne die Branch-Historie zu ändern.
git restore <file> --source <commit>
Ersetzen Sie <commit> durch den Commit-Hash oder eine symbolische Referenz wie HEAD~1.
git reset: Die Historie umschreiben
git reset ist ein mächtigerer Befehl, der Ihre Commit-Historie ändern kann, indem er den HEAD-Zeiger des aktuellen Branches verschiebt. Je nach verwendetem Modus kann er auch den Staging-Bereich und das Arbeitsverzeichnis beeinflussen.
Die Modi verstehen (--soft, --mixed, --hard)
git reset hat drei Hauptmodi:
-
--soft: VerschiebtHEADauf den angegebenen Commit, lässt Ihren Staging-Bereich und Ihr Arbeitsverzeichnis jedoch unverändert. Änderungen aus den zurückgesetzten Commits erscheinen als gestagte Änderungen.
bash git reset --soft HEAD^ # Verschiebt HEAD um einen Commit zurück, Änderungen aus dem rückgängig gemachten Commit sind gestaged -
--mixed(Standard): VerschiebtHEADund setzt den Staging-Bereich so zurück, dass er dem angegebenen Commit entspricht. Änderungen aus den zurückgesetzten Commits sind in Ihrem Arbeitsverzeichnis vorhanden, aber ungestaged.
bash git reset HEAD^ # Entspricht git reset --mixed HEAD^ # Verschiebt HEAD um einen Commit zurück, Änderungen aus dem rückgängig gemachten Commit sind ungestaged -
--hard: VerschiebtHEADund setzt sowohl den Staging-Bereich als auch das Arbeitsverzeichnis so zurück, dass sie dem angegebenen Commit entsprechen. Dies verwirft alle Änderungen aus den zurückgesetzten Commits und alle nachfolgenden uncommitted Änderungen im Arbeitsverzeichnis. Mit äußerster Vorsicht verwenden.
bash git reset --hard HEAD~ # Verwirft den letzten Commit UND alle Änderungen seitdem im Arbeitsverzeichnis und Staging-Bereich
Anwendungsfälle für git reset:
- Dateien entstaggen:
git reset <file>ist eine Abkürzung fürgit restore --staged <file>, wodurch eine Datei aus dem Staging-Bereich entfernt wird, ohne das Arbeitsverzeichnis zu beeinflussen. - Alles entstaggen:
git reset(ohne Argumente oder Angabe vonHEAD) entstaggt alle aktuell gestagten Änderungen und verschiebt sie zurück in das Arbeitsverzeichnis (entsprichtgit restore --staged .). - Den letzten Commit rückgängig machen:
git reset HEAD^(odergit reset --soft HEAD^) wird häufig verwendet, um den letzten Commit zu ändern (amend). Die Änderungen aus dem vorherigen Commit sind nun gestaged und bereit, mit Modifikationen oder einer neuen Nachricht erneut committet zu werden. - Alle lokalen Änderungen verwerfen:
git reset --hardwird verwendet, um alle lokalen Modifikationen (gestagt und ungestagt) vollständig zu verwerfen und das Repository auf einen bestimmten Commit zurückzusetzen. Dies ist ein destruktiver Vorgang.
Einen alten Commit zurücksetzen
Wenn Sie Änderungen an einem Commit rückgängig machen müssen, der nicht der aktuellste ist, kann git reset verwendet werden. Um beispielsweise auf einen Commit vor einem problematischen Commit zurückzusetzen:
# Beispiel: Die letzten 2 Commits rückgängig machen, Änderungen ungestaged lassen
git reset --mixed HEAD~2
Warnung: git reset schreibt die Historie um. Wenn Sie die Commits, die Sie zurücksetzen, bereits gepusht haben, kann dies zu erheblichen Problemen für Mitarbeiter führen. Es ist im Allgemeinen sicher, nur Commits zurückzusetzen, die sich nur in Ihrem lokalen Repository befinden.
git revert: Einen neuen Commit erstellen, um Änderungen rückgängig zu machen
git revert ist die sicherste Methode, um Änderungen in einer geteilten oder veröffentlichten Historie rückgängig zu machen. Anstatt die Historie umzuschreiben, erstellt es einen neuen Commit, der die umgekehrten Änderungen eines vorherigen Commits einführt.
Wie es funktioniert
Wenn Sie git revert <commit> ausführen, analysiert Git den angegebenen Commit, berechnet die entgegengesetzten Änderungen und wendet sie auf Ihr aktuelles Arbeitsverzeichnis und den Staging-Bereich an. Anschließend werden Sie aufgefordert, einen neuen Commit mit einer Standardnachricht zu erstellen, die angibt, welcher Commit rückgängig gemacht wird.
-
Einen bestimmten Commit rückgängig machen:
bash git revert <commit-hash>
Dies erstellt einen neuen Commit, der die durch<commit-hash>eingeführten Änderungen rückgängig macht. Wenn Merge-Konflikte auftreten, hält Git an und verlangt, dass Sie diese lösen, bevor Sie committen. -
Mehrere Commits rückgängig machen:
Sie können einen Bereich von Commits rückgängig machen:
bash # Commits von HEAD~3 bis (aber nicht einschließlich) HEAD rückgängig machen git revert HEAD~3..HEAD
Git versucht, für jeden angegebenen Commit einen Revert-Commit zu erstellen. Wenn dabei Konflikte auftreten, müssen Sie diese für jeden Revert lösen.
Vorteile von git revert:
- Bewahrt die Historie: Es verändert keine bestehenden Commits, was es für öffentliche oder geteilte Branches sicher macht.
- Klarer Prüfpfad: Der Revert-Commit gibt explizit an, was rückgängig gemacht wurde und warum.
- Geht elegant mit Merges um: Git kann oft Merge-Commits automatisch rückgängig machen, obwohl bei komplexen Szenarien manuelle Eingriffe erforderlich sein können.
Wann sollte git revert verwendet werden:
- Wenn Sie Änderungen an einem Branch rückgängig machen müssen, der bereits auf ein Remote-Repository gepusht wurde.
- Wenn Sie eine klare und unveränderliche Aufzeichnung aller Änderungen, einschließlich Korrekturen, beibehalten möchten.
- Wenn Sie einen Merge-Commit rückgängig machen.
Die Wahl des richtigen Befehls
Hier ist eine einfache Anleitung, die Ihnen bei der Entscheidung hilft:
- Um eine Datei zu entstaggen: Verwenden Sie
git restore <file>odergit reset <file>. - Um ungestagte Änderungen im Arbeitsverzeichnis für eine Datei zu verwerfen: Verwenden Sie
git restore <file>. - Um alle Änderungen (gestagt und ungestagt) für eine Datei zu verwerfen: Verwenden Sie
git restore --staged --worktree <file>. - Um den letzten Commit rückgängig zu machen und Änderungen gestaged zu behalten (zum Ändern): Verwenden Sie
git reset --soft HEAD^. - Um den letzten Commit rückgängig zu machen und Änderungen ungestaged zu behalten: Verwenden Sie
git reset HEAD^. - Um den letzten Commit und alle nachfolgenden Änderungen vollständig zu verwerfen (destruktiv): Verwenden Sie
git reset --hard HEAD^. - Um einen Commit in einem geteilten Branch rückgängig zu machen, ohne die Historie umzuschreiben: Verwenden Sie
git revert <commit-hash>. - Um alle lokalen Änderungen im gesamten Repository zu verwerfen (destruktiv): Verwenden Sie
git reset --hard.
Fazit
Die Beherrschung von git reset, git restore und git revert ist grundlegend für die effektive Nutzung von Git. git restore ist Ihr Werkzeug der Wahl, um sicher Änderungen im Arbeitsverzeichnis und im Staging-Bereich zu verwerfen. git reset bietet leistungsstarke Funktionen zum Umschreiben der Historie, die am besten für lokale, nicht gepushte Commits verwendet werden sollten. git revert bietet eine sichere, historienbewahrende Methode zum Rückgängigmachen von Änderungen, was besonders in kollaborativen Umgebungen wichtig ist. Indem Sie ihre unterschiedlichen Verhaltensweisen verstehen und den geeigneten Befehl auswählen, können Sie die Entwicklung Ihres Projekts souverän verwalten und alle Fehler auf dem Weg korrigieren.