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.txtNü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 dateiverwirft Änderungen einer Datei,git restore --staged dateinimmt 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 sichernSo 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, danngit branch name <sha>. - Rebase kaputt:
git rebase --abortodergit reset --hard ORIG_HEAD. - Falscher Branch committed:
git branch neu, dann auf dem altengit 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