git reset

Grundlegende Snapshots

Den aktuellen HEAD auf den angegebenen Zustand zurücksetzen


Der Befehl 'git reset' macht Änderungen rückgängig, indem er den HEAD des aktuellen Branches auf einen bestimmten Commit verschiebt. Er hat drei Hauptmodi: --soft (Änderungen bleiben gestagt), --mixed (Standard – Änderungen bleiben im Arbeitsverzeichnis) und --hard (verwirft alle Änderungen). Der Befehl ist zentral, um Commits rückgängig zu machen, Dateien zu unstagen und deine Commit-Historie zu verwalten. Vorsicht mit 'git reset --hard', das Änderungen endgültig verwirft.

Syntax

git reset [-q] [<tree-ish>] [--] <pathspec>...
git reset [-q] [--pathspec-from-file=<file>] [<tree-ish>]
git reset (--patch | -p) [<tree-ish>] [--] [<pathspec>...]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
[ ] optional| oder<arg> Platzhalter... wiederholbar--flag Option

Optionen

Klicke auf eine Option, um sie aufzuklappen

Einsteiger (3)

Setzt HEAD auf den angegebenen Commit zurück, behält aber alle Änderungen gestagt. Arbeitsverzeichnis und Staging-Bereich bleiben unverändert. Nutze das, um Commits rückgängig zu machen und die Änderungen zum erneuten Committen bereitzuhalten.

Bei BedarfCommits zurücknehmen, Änderungen bleiben gestagt – z. B. zum Neu-Committen oder Zusammenfassen

Beispiel

git reset --soft HEAD~1

Der Standardmodus. Setzt HEAD und den Staging-Bereich zurück, behält aber die Änderungen im Arbeitsverzeichnis. Nutze das, um Änderungen zu unstagen und sie weiter bearbeiten zu können.

EmpfohlenSicherster Weg, einen lokalen Commit zurückzunehmen oder aus dem Staging zu nehmen; behält deine Änderungen

Beispiel

git reset HEAD~1

Setzt HEAD, den Staging-Bereich UND das Arbeitsverzeichnis auf den angegebenen Commit zurück. Nicht committete Änderungen an verfolgten Dateien werden verworfen, und unverfolgte Dateien, die den Dateien des Commits im Weg sind, werden überschrieben (andere unverfolgte Dateien bleiben unberührt). Für nicht committete Änderungen gibt es kein Zurück.

Nicht empfohlenZerstört nicht committete Änderungen an getrackten Dateien – vorher stashen oder committen

Beispiel

git reset --hard HEAD~1

Fortgeschritten (1)

Interaktiv Hunks zum Unstagen auswählen. So entfernst du gezielt bestimmte Änderungen aus dem Staging-Bereich und lässt andere gestagt.

Bei BedarfHunks interaktiv aus dem Staging nehmen

Beispiel

git reset -p

Erfahren (2)

Setzt den Index zurück und aktualisiert Dateien, die sich zwischen Commit und HEAD unterscheiden, behält aber ungestagte Änderungen. Gestagte Änderungen werden verworfen. Bricht ab, wenn eine Datei, die sich ändern muss, ungestagte Änderungen hat.

Bei BedarfBricht einen Merge ab; verwirft gestagte, behält aber ungestagte Änderungen

Beispiel

git reset --merge HEAD~1

Setzt den Index zurück und aktualisiert Dateien, die sich zwischen Commit und HEAD unterscheiden. Bricht ab, wenn eine dieser Dateien lokale Änderungen hat. Behält nicht committete Änderungen an Dateien, die zwischen den Commits gleich sind.

Bei BedarfSicherer als --hard zum Zurückgehen: verweigert das Überschreiben lokaler Änderungen

Beispiel

git reset --keep HEAD~1

Die richtige Option wählen

Reset-Modi: Was bleibt erhalten?

Die drei Hauptmodi von reset verstehen und was mit deinen Änderungen passiert

BefehlHEAD bewegt sichStaging-BereichArbeitsverzeichnisNutzen, wenn
--softJaErhalten (gestagt)ErhaltenCommit rückgängig machen, mit Änderungen neu committen
--mixed (default)JaGeleert (ungestagt)ErhaltenCommit rückgängig machen, vor dem Stagen bearbeiten
--hardJaGeleertVerfolgte Änderungen VERLOREN (unverfolgte bleiben)Commit und alle Änderungen komplett verwerfen

Reset, Revert oder Checkout

Den passenden Rückgängig-Befehl für deine Lage wählen

BefehlÄndert Historie?Sicher bei gepushten Commits?Am besten für
git resetJa (verschiebt den Branch)Nein – macht ProblemeLokale, noch nicht gepushte Commits rückgängig machen
git revertNein (fügt neuen Commit hinzu)Ja – sicher auf geteilten BranchesGepushte Commits auf geteilten Branches rückgängig machen
git checkout -- fileNoJaNicht committete Änderungen an bestimmten Dateien verwerfen

Änderungen unstagen: reset oder restore

Modernes Git bietet git restore als Alternative zu reset fürs Unstagen

BefehlZweckBetrifft Commits?Empfohlen
git reset HEAD fileEine Datei unstagenNoKlassischer Weg
git restore --staged fileEine Datei unstagenNoModerner Weg (Git 2.23+)
git resetAlle Dateien unstagenNoFunktioniert gut
git restore --staged .Alle Dateien unstagenNoKlarere Absicht

Fortgeschrittene Reset-Modi

Wann --merge und --keep statt --hard

BefehlBehält lokale Änderungen?Bricht bei Konflikten ab?Anwendungsfall
--hardNein – zerstört allesNoVollständiger Reset, Änderungen egal
--mergeNur ungestagte Änderungen (gestagte gehen verloren)JaEinen Merge abbrechen und unabhängige Arbeit behalten
--keepJa (in Dateien, die der Reset nicht berührt)JaCommit rückgängig machen, aber unabhängige lokale Änderungen behalten

Beispiele

Letzten Commit rückgängig machen, Änderungen gestagt behalten

git reset --soft HEAD~1

Setzt HEAD einen Commit zurück. Die Änderungen dieses Commits bleiben gestagt und können neu committet werden.


Letzten Commit rückgängig machen, Änderungen im Arbeitsverzeichnis behalten

git reset HEAD~1

Standardmodus (--mixed). Setzt HEAD einen Commit zurück. Die Änderungen bleiben erhalten, sind aber ungestagt.


Letzten Commit und Änderungen komplett verwerfen

git reset --hard HEAD~1

Setzt HEAD einen Commit zurück und verwirft ALLE nicht committeten Änderungen an verfolgten Dateien. Mit Vorsicht nutzen – verlorene, nicht committete Arbeit ist nicht wiederherstellbar (der Commit selbst bleibt im git reflog).


Eine bestimmte Datei unstagen

git reset HEAD file.js

Entfernt file.js aus dem Staging-Bereich, ohne die Änderungen zu verwerfen. Die Datei bleibt im Arbeitsverzeichnis geändert.

Workflow-Beispiele

1
git log --oneline -3

Letzte Commits ansehen, um zu bestätigen, welcher rückgängig gemacht wird

2
git reset --soft HEAD~1

Commit rückgängig machen, Änderungen gestagt behalten

3
git status

Prüfen, dass die Änderungen gestagt sind

4
git commit -m "Better message"

Mit neuer Nachricht erneut committen

1
git status

Sehen, was gerade gestagt ist

2
git reset HEAD unwanted-file.js

Bestimmte Datei(en) unstagen

3
git status

Bestätigen, dass die Datei nicht mehr gestagt ist

4
git commit

Nur die gewünschten Dateien committen

1
git status

Prüfen, was verloren geht

2
git stash

(Optional) Änderungen sicherheitshalber stashen

3
git reset --hard HEAD~1

Letzten Commit UND alle verfolgten Änderungen verwerfen (unverfolgte Dateien bleiben)

4
git status

Bestätigen, dass das Arbeitsverzeichnis sauber ist

1
git reflog

Den Commit-Hash vor dem Reset finden

2
git reset --hard abc1234

Auf diesen Commit-Hash zurücksetzen

3
git log --oneline

Prüfen, dass die Commits wiederhergestellt sind

Fehlerbehebung

fatal: ambiguous argument 'HEAD~1': unknown revision

Ursache: Du bist auf dem ersten Commit – es gibt keinen vorigen Commit zum Zurücksetzen

Prüfe git log. Gibt es nur einen Commit, kannst du nicht weiter zurück. Mit git update-ref -d HEAD fängst du ganz neu an.

error: Entry 'app.js' not uptodate. Cannot merge.

Ursache: Eine Datei, die --merge oder --keep ändern müsste, hat nicht committete lokale Änderungen, also wird der Reset abgebrochen

Committe oder stashe deine Änderungen zuerst, oder nutze --hard, wenn du sie verwerfen willst

Versehentlich --hard genutzt und Änderungen verloren

Ursache: Ein Hard-Reset verwirft alle nicht committete Arbeit endgültig

Waren die Änderungen vorher committet: mit git reflog den Commit finden, dann git reset --hard <hash>. Waren sie nie committet: vermutlich für immer verloren.

Reset hat geklappt, aber ein Kollege sagt, die Historie ist kaputt

Ursache: Du hast Commits zurückgesetzt, die schon auf einen geteilten Branch gepusht waren

Nutze auf geteilten Branches git revert. Zum Reparieren: git reflog, den ursprünglichen Commit finden, darauf zurücksetzen, force-pushen (mit dem Team absprechen).

fatal: ambiguous argument 'HEAD' bei git reset HEAD file

Ursache: Das Repository hat noch keine Commits, also existiert HEAD nicht (oder der Pfad ist falsch)

Lass HEAD weg: git reset file.js (oder git rm --cached file.js). Prüfe den genauen Pfad mit git status.

Tipps & Stolperfallen

Best Practices

  • ✓Nutze git reset nie auf Commits, die auf geteilte Branches gepusht wurden – nutze stattdessen git revert
  • ✓Führe vor einem Reset immer git status aus, um zu verstehen, was betroffen ist
  • ✓Nutze --soft, wenn du einen Commit mit Änderungen neu machen willst
  • ✓Nutze git stash vor einem Reset mit --hard, falls du deine Änderungen vielleicht zurückwillst
  • ✓Denk daran: git reflog rettet die meisten Reset-Fehler (bei committeten Änderungen)
  • ✓Nutze git reset HEAD <file>, um Dateien zu unstagen, statt ganze Commits zurückzusetzen
  • ✓Nutze eventuell git restore --staged als moderne Alternative zum Unstagen von Dateien

Häufige Fehler

  • ✗'git reset --hard' nutzen, ohne zu merken, dass es nicht committete Änderungen endgültig löscht. Prüfe vor --hard immer doppelt.
  • ✗Commits zurücksetzen, die schon auf ein geteiltes Remote gepusht wurden. Das schreibt die Historie um und macht Mitwirkenden Probleme. Nutze stattdessen 'git revert'.
  • ✗'git reset' mit 'git revert' verwechseln. Reset schiebt den Branch-Zeiger zurück; revert erzeugt einen neuen Commit, der Änderungen rückgängig macht.
  • ✗Nicht wissen, dass man sich von einem schlechten Reset mit 'git reflog' erholen kann, um den vorigen Commit-Hash zu finden.
  • ✗'git reset --hard HEAD' nutzen, um Arbeitsänderungen zu verwerfen, obwohl 'git checkout -- .' oder 'git restore .' passender wären.

FAQ

A:

Soft behält Änderungen gestagt. Mixed (Standard) behält sie im Arbeitsverzeichnis, aber ungestagt. Hard verwirft alles. Merke: soft = nur Commit rückgängig, mixed = Commit rückgängig + unstagen, hard = alles rückgängig.

A:

Bei committeten Änderungen: ja, finde mit git reflog den ursprünglichen Commit-Hash und setze darauf zurück. Bei nicht committeten Änderungen, die --hard verworfen hat: meist nein, die sind endgültig weg.

A:

HEAD~1 bedeutet „ein Commit vor HEAD“. HEAD~2 ist zwei Commits zurück usw. Du kannst auch direkt Commit-Hashes nutzen, etwa git reset abc1234.

A:

Reset für lokale, noch nicht gepushte Commits – es schreibt die Historie sauber um. Revert für gepushte Commits auf geteilten Branches – es erzeugt einen neuen Commit, der Änderungen rückgängig macht, ohne die Historie umzuschreiben.

A:

Nutze git reset HEAD filename, um eine bestimmte Datei zu unstagen. HEAD bewegt sich nicht und kein Commit ist betroffen – die Datei wird nur aus dem Staging-Bereich entfernt.

A:

Es löscht nicht committete Änderungen endgültig. Anders als committete Änderungen (über das Reflog wiederherstellbar) lässt sich nie committete Arbeit nach einem Hard-Reset nicht zurückholen.