Zum Inhalt springen

So machen Sie einen Git-Commit rückgängig und stellen den vorherigen Zustand wieder her

Mittel 10 Min. Aktualisiert:

Kurze Antwort

Einen Commit machen Sie mit `git reset` rückgängig, wenn die Änderung noch nicht in das Remote-Repository übertragen wurde, oder mit `git revert`, wenn sie bereits mit anderen geteilt wurde. Prüfen Sie vor allem `git status` und `git log`, denn `git reset --hard` löscht nicht committete Änderungen in verfolgten Dateien dauerhaft.

So erkennen Sie das Problem

  • Sie haben einen Commit mit falschen Dateien oder einer falschen Nachricht erstellt
  • Der letzte Commit hat den Build oder die Tests beschädigt
  • Der Commit wurde bereits in das Remote-Repository übertragen, und Sie wissen nicht, wie Sie ihn entfernen sollen
  • Sie haben versehentlich `git reset --hard` ausgeführt und Änderungen verloren
  • Der Arbeitsbaum befindet sich nach einem fehlgeschlagenen Reset in einem seltsamen Zustand

Häufigste Ursachen

Falscher Inhalt des Commits

In den Commit sind Dateien gelangt, die nicht dorthin gehören, wie z. B. eine `.env`-Datei oder Änderungen aus einem anderen Branch.

Commit mit einem Fehler im Code

Die Änderung wurde lokal übernommen, aber sie lässt Tests oder die Anwendung fehlschlagen, daher muss die vorherige Version wiederhergestellt werden.

Commit wurde bereits geteilt

Wenn der Commit in den `main`-Branch übertragen wurde, den auch andere verwenden, verursacht das Umschreiben der Historie Probleme für die Mitarbeiter.

Missverständnis der Reset-Optionen

`--soft`, `--mixed` und `--hard` behandeln den Index und das Arbeitsverzeichnis unterschiedlich, wodurch leicht Änderungen verloren gehen.

Lösung Schritt für Schritt

  1. 1

    Prüfen Sie den aktuellen Zustand des Repositorys

    Führen Sie git status aus, um zu sehen, ob es nicht committete Änderungen gibt, und git log --oneline -5, um die letzten fünf Commits anzuzeigen. Notieren Sie den Hash des Commits, zu dem Sie zurückkehren möchten, da Sie ihn in den folgenden Schritten benötigen. Wenn es nicht committete Arbeit gibt, speichern Sie diese zuerst mit git stash.

  2. 2

    Erstellen Sie eine Sicherungskopie des Branches

    Erstellen Sie vor jedem Reset einen Branch, der auf den aktuellen Zustand zeigt: git branch backup-<Name>. So können Sie zum alten Zustand zurückkehren, falls etwas schiefgeht. Dieser Branch stört nicht, und Sie können ihn später mit git branch -D backup-<Name> löschen.

  3. 3

    Machen Sie den letzten Commit rückgängig, ohne Änderungen zu löschen

    Wenn Sie möchten, dass der Commit verschwindet, die Änderungen aber im Arbeitsverzeichnis bleiben, verwenden Sie git reset --soft HEAD~1. Die Dateien bleiben geändert und bereit für einen neuen, korrekten Commit. Dies ist die sicherste Option für die lokale Arbeit.

  4. 4

    Setzen Sie den Index und das Arbeitsverzeichnis auf den vorherigen Commit zurück

    Für eine vollständige Wiederherstellung des vorherigen Zustands verwenden Sie git reset --hard HEAD~1. Warnung: Dieser Befehl entfernt den letzten Commit vom aktuellen Branch und löscht dauerhaft alle nicht committeten Änderungen in verfolgten Dateien. Prüfen Sie zuerst git status und erstellen Sie einen Sicherungsbranch.

  5. 5

    Kehren Sie zu einem bestimmten Commit anhand des Hashes zurück

    Wenn Sie nicht nur den letzten Commit zurücksetzen möchten, geben Sie den Hash an: git reset --hard <Hash>. Den Hash finden Sie in git log --oneline. Für mehrere Commits zurück verwenden Sie HEAD~3 anstelle des Hashes. Auch hier gilt die Warnung: Erstellen Sie zuerst einen Sicherungsbranch und prüfen Sie git status, da dieser Befehl nicht committete Änderungen in verfolgten Dateien löscht.

  6. 6

    Machen Sie einen bereits übertragenen Commit rückgängig

    Wenn der Commit bereits im Remote-Repository ist, verwenden Sie kein reset auf dem geteilten Branch. Führen Sie stattdessen git revert <Hash> aus, wodurch ein neuer Commit mit den entgegengesetzten Änderungen erstellt wird. Übertragen Sie diesen dann mit git push.

  7. 7

    Stellen Sie verlorene Commits aus dem Reflog wieder her

    Wenn Sie versehentlich reset --hard ausgeführt und einen Commit verloren haben, führen Sie git reflog aus und suchen Sie den Hash des Zustands vor dem Reset. Kehren Sie dann mit git reset --hard <Hash> zurück, prüfen Sie aber zuerst git status, da auch dieser Befehl nicht committete Änderungen in verfolgten Dateien löscht. Das Reflog speichert die Historie des HEAD-Zeigers normalerweise 30 bis 90 Tage, kann aber nicht committete Änderungen nicht wiederherstellen.

  8. 8

    Überprüfen Sie das Ergebnis und arbeiten Sie weiter

    Führen Sie git status und git log --oneline -3 aus, um zu bestätigen, dass der Zustand korrekt ist. Wenn Sie revert verwendet haben, prüfen Sie, ob der neue Commit vorhanden ist. Erst wenn Sie sicher sind, löschen Sie den Sicherungsbranch.

Wann Reset nicht ausreicht

Wenn der falsche Commit bereits in einen geteilten Branch gelangt ist und andere ihn gepullt haben, ist git revert der sicherste Weg. Das erzwungene Übertragen einer umgeschriebenen Historie mit git push --force auf einem geteilten Branch kann die Commits anderer löschen und bei allen Mitarbeitern Konflikte verursachen. Wenn Sie einen Force-Push durchführen müssen, informieren Sie zuerst das Team und verwenden Sie --force-with-lease anstelle von --force, da dieser Befehl anhält, wenn jemand in der Zwischenzeit Änderungen übertragen hat. Bei großen Dateien oder geheimen Schlüsseln, die in die Historie gelangt sind, reicht ein Reset nicht aus: Es ist eine Bereinigung der Historie und eine Rotation der Schlüssel erforderlich.

So beugen Sie vor

  • Committen Sie häufig und in kleinen Einheiten mit einer klaren Nachricht
  • Prüfen Sie vor `reset --hard` immer `git status` und erstellen Sie einen Sicherungsbranch
  • Verwenden Sie `git revert` auf geteilten Branches und `reset` nur lokal
  • Übertragen Sie Ihre Arbeit regelmäßig in das Remote-Repository, damit Sie nicht nur vom lokalen Zustand abhängig sind

Wann Sie einen Profi rufen sollten

Wenn der falsche Commit bereits in einem geteilten Branch ist, den mehrere Personen verwenden, oder wenn Sie nicht sicher sind, was ein Reset mit Ihrer nicht committeten Arbeit macht, ist es besser, den IT-Support zu konsultieren, bevor Sie selbst weitermachen.

Software- und Produktentwicklung · Individuelle Apps, SaaS und ein MVP in 4 bis 8 Wochen

Häufige Fragen

Was ist der Unterschied zwischen git reset und git revert?

`git reset` verschiebt den Branch-Zeiger und schreibt die Historie um, ist also nur lokal sicher. `git revert` erstellt einen neuen Commit, der den vorherigen rückgängig macht, und ändert die Historie nicht, ist also für geteilte Branches geeignet.

Kann ich einen versehentlich gelöschten Commit wiederherstellen?

Ja, wenn Sie ihn in `git reflog` finden. Führen Sie `git reflog` aus, suchen Sie den Hash des gewünschten Zustands und kehren Sie mit `git reset --hard <Hash>` zurück.

Was bedeuten --soft, --mixed und --hard bei git reset?

`--soft` behält die Änderungen im Index und im Arbeitsverzeichnis, `--mixed` (Standard) behält die Änderungen nur im Arbeitsverzeichnis, und `--hard` löscht die Änderungen in verfolgten Dateien und setzt sie auf den Zustand des Commits zurück.

Teilen
Keine Lösung gefunden?Der KI-IT-Assistent ist rund um die Uhr erreichbar. Beschreiben Sie das Problem oder senden Sie einen Screenshot und erhalten Sie eine Anleitung für Ihren Fall.KI-IT-Assistent fragen