EMZETT.
Login

git stash, reflog und reset: Änderungen sichern und retten

Kurz: Mit stash legt man unfertige Arbeit beiseite, mit reset setzt man Stände zurück, und das reflog hilft fast jeden scheinbar verlorenen Commit wiederzufinden.

Genauer: Git speichert viel mehr, als man denkt: Auch nach reset --hard, einem versehentlich gelöschten Branch oder einem schiefgegangenen Rebase lässt sich oft alles retten, solange man schnell handelt. Ein kleines Repertoire reicht.

Im Detail

git stash: Arbeit beiseitelegen

git stash                    # aktuelle Änderungen weglegen
git stash -u                 # auch neue (untracked) Dateien
git stash list               # Liste
git stash pop                # letzten Stash zurückholen (und löschen)
git stash apply stash@{1}    # bestimmten zurückholen (behalten)
git stash drop               # löschen
git stash push -m "Experiment" datei.txt

Nützlich, wenn man schnell den Branch wechseln muss, ohne zu committen. Stashes gehören nur lokal zu dir; wichtige Arbeit lieber in einen eigenen Branch committen.

git reset: zurücksetzen

  • git reset --soft HEAD~1: letzten Commit zurücknehmen, Änderungen bleiben vorgemerkt (staged).
  • git reset HEAD~1 (mixed): Commit zurücknehmen, Änderungen bleiben im Arbeitsverzeichnis.
  • git reset --hard HEAD~1: Commit und Änderungen verwerfen (gefährlich!).
  • git restore datei verwirft Änderungen einer Datei, git restore --staged datei nimmt sie aus der Staging-Area.
  • Auf geteilten Branches statt Reset besser git revert <commit>: erzeugt einen neuen Commit, der die Änderung rückgängig macht, ohne die Historie umzuschreiben.

git reflog: das Sicherheitsnetz

Das Reflog protokolliert, wohin HEAD und Branches in den letzten Wochen zeigten:

git reflog
# a1b2c3d HEAD@{0}: reset: moving to HEAD~3
# e4f5g6h HEAD@{1}: commit: Neue Funktion
git reset --hard e4f5g6h          # alten Stand wiederherstellen
git branch gerettet e4f5g6h       # oder als neuen Branch sichern

So bekommt man verlorene Commits nach falschem Reset, Rebase oder gelöschtem Branch zurück (standardmäßig etwa 90 Tage, nur im lokalen Repository).

Typische Rettungen

  • Branch versehentlich gelöscht: git reflog, dann git branch name <sha>.
  • Rebase kaputt: git rebase --abort oder git reset --hard ORIG_HEAD.
  • Falscher Branch committed: git branch neu, dann auf dem alten git reset --hard HEAD~1.
  • Datei gelöscht, aber committed: git restore --source=<commit> -- datei.
  • Nie committet: Dann hilft Git oft nicht; regelmäßig committen, auch unfertig (WIP-Commits), und später aufräumen.

Siehe auch: Git, git rebase, git bisect und cherry-pick, Merge-Konflikt lösen, Push rejected