Help! I fucked up
Git kann praktisch alle Operationen rückgängig machen. Eine der wenigen Ausnahme haben wir im letzten Kapitel gesehen: Wenn ein Hard Reset durchgeführt wird, ohne dass Änderungen commited wurden, gehen diese unwiederbringlich verloren.
Reflog
Abgesehen davon speichert git alle Änderungen von Commits und Branches im Repository die wir vorgenommen haben. Wir können all diese im Reflog anschauen:
$ git reflog
> e0a7930 HEAD@{0}: merge feature/hello_user: Merge made by the 'ort' strategy.
f239baa HEAD@{1}: checkout: moving from feature/hello_user to main
656d544 (feature/hello_user) HEAD@{2}: commit: added hello_user
f239baa HEAD@{3}: commit: added echo functionality
Back in Time
Um in der Zeit zurückzugehen bevor wir etwas versehentlich kaputt gemacht haben, müssen wir nur einen reset in Kombination mit unserer HEAD@{index}
Referenz durchführen. Git setzt daraufhin alle Änderungen bis zu diesem Zeitpunkt zurück.
$ git reset HEAD@{index}
Oben haben wir gesehen, dass wir als letztes einen Merge durchgeführt hatten. Sollten wir diesen rückgängig machen wollen, können wir das mit folgendem Befehlt tun:
$ git reset HEAD@{1}
Schauen wir uns daraufhin das Reflog erneut an:
$ git reflog
> 1533063 (HEAD -> main) HEAD@{0}: reset: moving to HEAD@{1}
e0a7930 HEAD@{1}: merge feature/hello_user: Merge made by the 'ort' strategy.
f239baa HEAD@{2}: checkout: moving from feature/hello_user to main
656d544 (feature/hello_user) HEAD@{3}: commit: added hello_user
f239baa HEAD@{4}: commit: added echo functionality
Auch unser Reset wurde im Reflog festgehalten. Wir können also auch diesen also jederzeit wieder rückgängig machen.
Auch wenn wir all diese Änderungen mit dem bereits bekannten
git reset
durchführen können, ist es oft deutlich einfacher und sicherer, wenn wir die Reflog Referenzen als Adressierung verwenden. Grade bei Resets von Merges können wir sonst schnell auf die falsche Referenz zurücksetzten. Reflog in Kombination mitgit reset
ist also so etwas wie unsere Time Machine.