git / Anleitungen

Git-Commit rückgängig machen: reset, revert oder restore?

Entscheide zuerst, was erhalten bleiben soll: Dateiänderungen, Commit-Verlauf oder beides. Prüfe anschließend, ob der Commit bereits geteilt wurde.

Die Beispiele verwenden Bash; beachte die Referenzen für Einzelheiten deiner Umgebung.

git — Spickzettel

Nach dem Arbeitsstand entscheiden

SituationBefehlErgebnis
Datei aus dem Index nehmengit restore --staged -- file.txtBehält die Änderungen in der Arbeitskopie.
Letzten lokalen Commit entfernen, Index behaltengit reset --soft HEAD~1Setzt den Branch einen Commit zurück.
Geteilten Commit rückgängig machengit revert <commit>Erzeugt einen neuen, umkehrenden Commit.

Prüfe git status und git log --oneline -5. Dieses Reset-Beispiel benötigt einen Eltern-Commit und einen privaten Branch. Bei einem Merge-Commit ist eine separate Prüfung nötig; wähle den Hauptelternteil nicht auf Verdacht.

Reset in einem Übungsrepository testen

Verwende ein neues, leeres Verzeichnis außerhalb deines Projekts. Die Übung erzeugt zwei Commits, entfernt den zweiten aus dem Branch-Verlauf und behält seine Änderung im Index.

git init -b main
git config user.name "DevSheet Demo"
git config user.email "demo@example.invalid"
printf "one\n" > note.txt
git add note.txt
git commit -m "First note"
printf "two\n" >> note.txt
git commit -am "Second line"
git reset --soft HEAD~1
git status --short
git diff --cached

Erwartet: M note.txt im Kurzstatus und eine hinzugefügte Zeile two im Index-Diff. Die Datei enthält weiterhin beide Zeilen.

Einen geteilten Commit umkehren

Prüfe den Commit bei sauberer Arbeitskopie und ersetze den Beispiel-Hash durch deinen eigenen. Git öffnet normalerweise einen Editor für die neue Commit-Nachricht.

git show a1b2c3d
git revert a1b2c3d
git status

Spätere Änderungen können Konflikte verursachen. Löse sie und nutze git revert --continue, oder brich mit git revert --abort ab. Revert entfernt weder den ursprünglichen Commit noch ein darin enthaltenes Geheimnis.

Änderungsverlust vermeiden

git reset --hard kann nicht committete Änderungen verwerfen und störende unversionierte Pfade überschreiben. Die Übung benötigt diesen Befehl nicht.

git restore -- file.txt ersetzt Änderungen außerhalb des Index; --staged betrifft den Index. Wurde ein Branch versehentlich verschoben, prüfe git reflog und erstelle einen Rettungsbranch am verifizierten früheren Commit. Reflog rettet nicht jede uncommittete Änderung.

Referenzen

Alle Anleitungen