So machen Sie Git-Fehler sicher rückgängig: Revert, Reset und Checkout erklärt
Navigieren Sie mit Zuversicht durch Git-Fehler! Dieser Leitfaden erklärt `git revert`, `git reset` und `git checkout`, um Commits sicher rückgängig zu machen, Dateien wiederherzustellen und den Verlauf Ihres Repositories zu verwalten. Erfahren Sie, wann und wie Sie jeden Befehl verwenden, um Fehler zu korrigieren, ohne wertvolle Arbeit zu verlieren, was ihn zur Pflichtlektüre für jeden Git-Benutzer macht.
So machen Sie Git-Fehler rückgängig: Revert, Reset und Checkout erklärt
Git-Fehler fühlen sich meist schlimmer an, als sie sind. Vielleicht haben Sie die falsche Datei committed, zu viel gestaged oder eine fehlerhafte Änderung auf einen gemeinsamen Branch gepusht. Die sichere Lösung hängt von einer Frage ab: Wurde die Änderung bereits geteilt?
Dieser Leitfaden erklärt anhand von Beispielen, die Sie sorgfältig kopieren können, wann Sie git revert, git reset und git checkout verwenden sollten. Die Kurzfassung ist einfach: Verwenden Sie git revert für geteilte Commits, git reset für lokale Bereinigungen und git checkout nur, wenn Sie Branches wechseln oder ältere Dateizustände wiederherstellen möchten.
Überprüfen Sie zuerst, was Sie rückgängig machen möchten
Bevor Sie einen Rückgängig-Befehl ausführen, prüfen Sie Ihren aktuellen Zustand:
git status
git log --oneline --decorate -5
git status zeigt Ihnen, ob Sie ungestagede, gestagede oder unverfolgte Arbeiten haben. git log zeigt die letzten Commits und wohin Ihr Branch zeigt.
Wenn Sie lokale Arbeiten haben, die Sie nicht verlieren möchten, erstellen Sie zuerst einen schnellen Sicherungsbranch:
git branch backup-vor-rueckgaengigmachung
Dieser Branch gibt Ihnen einen einfachen Weg zurück, falls Sie den falschen Befehl wählen.
Verwenden Sie git revert für bereits gepushte Commits
git revert erstellt einen neuen Commit, der das Gegenteil eines früheren Commits anwendet. Es löscht keinen Verlauf und ist daher die sicherste Wahl für gemeinsame Branches wie main, develop oder jeden Branch, den andere möglicherweise bereits gepullt haben.
Angenommen, Ihr Verlauf sieht so aus:
A -- B -- C -- D main
Commit C hat einen Fehler eingeführt, aber D ist gut und muss bleiben. Finden Sie den Commit-Hash:
git log --oneline
Machen Sie dann nur diesen Commit rückgängig:
git revert abcdef1
Git öffnet Ihren Editor für die Revert-Commit-Nachricht. Nachdem Sie sie gespeichert haben, sieht der Verlauf so aus:
A -- B -- C -- D -- E main
Commit E macht die Änderungen von C rückgängig. Jeder kann diesen neuen Commit normal pullen.
Einen Merge-Commit rückgängig machen
Merge-Commits benötigen ein zusätzliches Flag, da Git wissen muss, welcher Parent der Hauptzweig ist:
git revert -m 1 <merge-commit-hash>
Bei einem normalen Merge in main bedeutet -m 1 normalerweise „den ersten Parent behalten“, also den Branch, in den gemergt wurde. Raten Sie hier nicht. Führen Sie zuerst dies aus und überprüfen Sie die Parents:
git show --summary <merge-commit-hash>
Wenn Sie nicht sicher sind, welchen Parent Sie behalten sollen, fragen Sie einen Teammitglied oder testen Sie den Revert auf einem temporären Branch.
Verwenden Sie git reset für lokale Commits
git reset verschiebt Ihren aktuellen Branch-Zeiger. Abhängig vom Modus kann es auch die Staging-Area und Ihre Arbeitsdateien ändern. Verwenden Sie es hauptsächlich für Commits, die Sie nicht gepusht haben.
Eine Datei unstagen
Wenn Sie die falsche Datei gestaged haben, stagen Sie sie ohne Änderung des Dateiinhalts aus:
git restore --staged unerwuenschte_datei.txt
Ältere Git-Beispiele verwenden oft diesen äquivalenten Befehl:
git reset HEAD unerwuenschte_datei.txt
Beide entfernen die Datei aus der Staging-Area. Ihre Bearbeitungen bleiben in Ihrem Arbeitsverzeichnis.
Den letzten Commit rückgängig machen, aber die Änderungen gestaged lassen
Verwenden Sie --soft, wenn die Commit-Nachricht falsch war oder Sie vor dem erneuten Committen eine weitere Datei hinzufügen möchten:
git reset --soft HEAD~1
Ihr Branch wird um einen Commit zurückgesetzt, aber die Änderungen dieses Commits bleiben gestaged.
Den letzten Commit rückgängig machen und die Änderungen ungestaged lassen
Verwenden Sie den standardmäßigen gemischten Reset, wenn Sie die Dateien vor dem erneuten Committen überarbeiten möchten:
git reset HEAD~1
Dies setzt den Branch um einen Commit zurück und belässt die Änderungen in Ihrem Arbeitsverzeichnis.
Lokale Commits und Dateiänderungen verwerfen
--hard setzt den Branch, die Staging-Area und die verfolgten Dateien in Ihrem Arbeitsverzeichnis zurück:
git reset --hard HEAD~1
Verwenden Sie dies nur, wenn Sie sicher sind, dass Sie die verworfenen Änderungen nicht benötigen. Es entfernt keine unverfolgten Dateien, aber es verwirft Bearbeitungen verfolgter Dateien ohne erneute Nachfrage.
Verwenden Sie git checkout mit Vorsicht
git checkout hat in älteren Git-Workflows zwei häufige Aufgaben: Branches wechseln und Dateien wiederherstellen. Neuere Git-Versionen teilen diese Aufgaben in klarere Befehle auf: git switch für Branches und git restore für Dateien.
Um Branches zu wechseln:
git switch main
Älteres Äquivalent:
git checkout main
Um uncommittete Änderungen in einer verfolgten Datei zu verwerfen:
git restore meine_datei.txt
Älteres Äquivalent:
git checkout -- meine_datei.txt
Diese Dateiwiederherstellung ist destruktiv für uncommittete Bearbeitungen in der ausgewählten Datei. Wenn Sie die Bearbeitungen später benötigen könnten, stashen Sie sie zuerst:
git stash push -m "Arbeit vor Wiederherstellung speichern"
Verwenden Sie git reflog, wenn Sie zu weit gegangen sind
Wenn Sie git reset --hard ausgeführt oder einen Branch versehentlich verschoben haben, zeigt git reflog möglicherweise noch, wohin HEAD zuvor gezeigt hat:
git reflog
Sie könnten einen früheren Eintrag wie HEAD@{2} oder einen Commit-Hash von vor dem Reset sehen. Sie können daraus einen Wiederherstellungsbranch erstellen:
git branch wiederherstellung <commit-hash>
Reflog ist lokal für Ihr Klon und kein Backup-System, aber es rettet Sie oft vor kürzlichen Fehlern.
Welchen Befehl sollten Sie wählen?
Verwenden Sie git revert, wenn der fehlerhafte Commit bereits gepusht wurde oder andere möglicherweise darauf aufbauen.
Verwenden Sie git reset --soft, wenn Ihr letzter lokaler Commit wiederholt werden soll, die Änderungen aber noch korrekt sind.
Verwenden Sie git reset, wenn Sie den letzten lokalen Commit als ungestagede Dateiänderungen zurückhaben möchten.
Verwenden Sie git reset --hard nur, wenn lokale verfolgte Änderungen gelöscht werden können.
Verwenden Sie git restore oder git checkout -- <datei>, wenn Sie uncommittete Änderungen in bestimmten Dateien verwerfen möchten.
Die sicherste Gewohnheit ist, git status zu überprüfen, bei hohem Risiko einen temporären Sicherungsbranch zu erstellen und das Umschreiben gemeinsamen Verlaufs zu vermeiden. Wenn ein Commit ein gemeinsames Remote erreicht hat, ist git revert normalerweise die sauberste Lösung.