git ready

leer git een commit per keer
by Nick Quaranto

terugzetten van verloren commits

Toegevoegd op 17 Jan 2009

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.