Zo, je hebt zojuist een git reset --hard HEAD^
gedaan en je laatste commit
weggegooid. Welnu, het blijkt dat je die wijziging wel degelijk nodig hebt. Het lukt nooit om dat algoritme twee keer perfect te implementeren, dus je moet het terug krijgen. Wees niet bang, git zou je commit
nog moeten hebben. Wanneer je een reset uitvoert, gaat de verwijderde commit
over naar een “bungelende” toestand. Hij is nog steeds in git’s administratie, wachtend op de eerst volgend garbage collection
om hem te verwijderen. Dus tenzij je git gc
gedraaid hebt sinds je, je commit
hebt verwijderd zou je, je commit
moeten kunnen terughalen.
Voor de volgende voorbeelden, werk ik met het de code voor deze blog. Van de top, hebben we zojuist uitgevoerd:
$ git show-ref -h HEAD 7c61179cbe51c050c5520b4399f7b14eec943754 HEAD $ git reset --hard HEAD^ HEAD is now at 39ba87b Fixing about and submit pages so they don't look stupid $ git show-ref -h HEAD 39ba87bf28b5bb223feffafb59638f6f46908cac HEAD
Dus ons HEAD
is een commit
teruggespoeld. Wanneer we op dit moment deze commit
terug willen krijgen kunnen we gewoon git pull
uitvoeren, maar we nemen aan dat uitsluitend onze lokale repository
de commit
kent. We hebben the SHA1 van de commit
nodig om hem terug te kunnen brengen. We kunnen bewijzen dat git nog steeds iets weet over de betreffende commit
met het fsck
commando:
$ git fsck --lost-found [... some blobs omitted ...] dangling commit 7c61179cbe51c050c5520b4399f7b14eec943754
Je kunt ook zien dat git nog weet heeft van de commit door het reflog
commando te gebruiken:
$ git reflog 39ba87b... HEAD@{0}: HEAD~1: updating HEAD 7c61179... HEAD@{1}: pull origin master: Fast forward [... lots of other refs ...]
Dus we hebben nu onze SHA1:7c61179
. Als we meteen de commit
terug willen krijgen in onze huidige branch
, zorgt een git merge
voor het terugbrengen van onze commit:
$ git merge 7c61179 Updating 39ba87b..7c61179 Fast forward css/screen.css | 4 ++++ submit.html | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-)
Dit commando brengt onze verloren wijzigingen terug verzeker jezelf ervan dat HEAD
wijst naar de juiste commit
. Vanaf nu kun je je werk voortzetten alsof er niets is gebeurt! Je kunt ook de SHA1 checkouten
in een nieuwe branch
, maar echt een merge
is de snelste en gemakkelijkste manier om de verloren commit
terug te brengen wanneer je eenmaal de hash hebt. Als je andere manieren weet laat het ons weten in het commentaar!
Als je meer keuzes over wat te doen in deze situatie wilt weten, Mathieu Martin’s geïllustreerde gids over het terugbrengen van verloren commits
met Git heeft er genoeg voor je.