Git Reflog: de ultieme gids voor herstel en inzicht in je Git-historie

In de wereld van Git is er een krachtig maar soms onderbelicht hulpmiddel dat je reddingsboei kan zijn wanneer de geschiedenis van je repository in het honderd loopt: de Git Reflog. Met git reflog kun je alle verwijzingen naarHEAD, branches en andere referenties volgen, zelfs nadat ze zijn verdwenen uit de standaard logboeken. Deze gids duikt diep in wat Git Reflog precies doet, hoe het werkt onder de motorkap, en hoe jij het grootste deel kan halen uit dit instrument om foutjes ongedaan te maken, commits terug te vinden en je workflow te verbeteren. Of je nu een beginnende gebruiker bent of een doorgewinterde Git-nerd, dit artikel biedt praktische voorbeelden, scenario’s en best practices die je direct kan inzetten.
Git Reflog: wat is git reflog precies?
Git Reflog, oftewel git reflog, is een lokale log van waar de referenties van jouw repository naartoe wijzen. Het registreert elke beweging van HEAD, maar ook van andere refs zoals lokale takken (branches) en winkelwagens van oorzaken zoals merges, resets, en cherry-picks. Denk aan reflog als een tijdsbedieningskader voor je Git-historie: elke keer dat HEAD beweegt, wordt er een voetafdruk achtergelaten in de reflog. Zelfs als je een commit verplaatst, herschrijf of verwijdert, blijft de reflog de plek waar die referenties nog steeds te vinden zijn voor een periode. Dit maakt het mogelijk om verloren commits en verkeerd uitgevoerde operations terug te halen.
Belangrijkste eigenschappen van Git Reflog:
- Lokale logboek: reflog is per repository en per gebruiker beschikbaar.
- Hardnekkige geschiedenis: zelfs nadat een commit is verwijderd uit de reguliere historie kan je het meestal nog terugvinden via git reflog.
- Beheerbare retentie: reflog entries verlopen na een bepaalde periode en kunnen worden opgeschoond met gerichte commands zoals
git reflog expire --expire=90.days.ago --allengit gc.
Hoe Git Reflog werkt: een kijkje onder de motorkap
Om te begrijpen hoe git reflog werkt, is het handig te weten waar het zijn informatie vandaan haalt. Elke ref die Git bijhoudt (HEAD, takken, en andere refs) heeft een bijbehorend reflog-bestand in de hidden .git-map van jouw lokale repository. Wanneer jij een actie uitvoert die de referenties verandert—zoals een commit, een reset, een rebase of een merge—neem reflog dit op als een nieuwe entriesreeks met een tijdstempel, een korte boodschap en de oude en nieuwe referenties.
Concreet proces:
- Git wijzigt een ref, bijvoorbeeld HEAD wijzigt van v1 naar v2 na een commit.
- Git schrijft een reflog-entry: HEAD@{0} verwijst nu naar v2, terwijl HEAD@{1} nog steeds naar v1 wijst.
- Deze opsomming blijft lokaal beschikbaar totdat de entries verlopen of handmatig verwijderd worden.
Waarom dit zo waardevol is? Omdat jij, na een fout, vaak niet direct op de oorspronkelijke commit terug kunt keren via de standaard log. Met git reflog kun je gelukkig wél terug naar een eerdere toestand door te navigeren naar een referentie zoals HEAD@{n} en vervolgens acties uit te voeren als reset, checkout of cherry-pick. Het is de ultieme “undo” voor bijna elke wijziging in je lokale geschiedenis.
Kerncommando’s van Git Reflog
Hieronder vind je de belangrijkste git reflog-commando’s die je dagelijks tegenkomt. Ik geef telkens korte uitleg, waarna voorbeeldcommando’s volgen die je direct kan kopiëren en uitproberen.
Basis: de reflog bekijken met git reflog
git reflog
Dit toont de volledige reflog voor HEAD. Wil je de reflog van een specifieke ref zien, zoals een tak?
git reflog show branch-name
Voorbeeld:
git reflog show main
Tip: in veel gevallen volstaat git reflog alleen, maar als je gericht wilt zoeken naar een foutieve beweging van een specifieke ref, gebruik dan reflog show met de naam van die ref.
Terug naar een vorige staat: herstellen met HEAD@{n}
Een van de krachtigste toepassingen van reflog is het terugkeren naar een vorige staat. Stel dat jouw HEAD eerder op commit abc123 stond en je wilt terug naar die toestand. Je kunt het reflog-anker gebruiken zoals HEAD@{n} en dan kiezen wat je wilt doen: checkout, reset of cherry-pick.
git reset --hard HEAD@{5}
Of, als je liever een tijdelijke stap wilt zetten voordat je een definitieve beslissing neemt:
git checkout HEAD@{5}
Let op: git reset –hard overschrijft je werkdirectory. Zorg ervoor dat je geen belangrijke onopgeslagen wijzigingen hebt. Een safer alternatief is git reset --soft of git reset --mixed, afhankelijk van wat je wilt behouden in je staging area.
Een fout herstellen met git reflog en git checkout of git reset
Stel dat je per ongeluk de verkeerde commit hebt gecommit of een rebase hebt uitgevoerd die je geschiedenis heeft gewijzigd. Je kan met reflog snel naar de juiste punt terugkeren:
git checkout HEAD@{8} # bekijk wat er in die staat gebeurt
git switch -c herstel-branch HEAD@{8} # maak een tijdelijke herstelbranch aan
Als je liever de HEAD-pointer wilt terugzetten en de kantopslag van je branch wilt herstellen, gebruik:
git reset --hard HEAD@{8}
Tijdelijk opschonen van referenties met git reflog expire en git gc
Git biedt mechanismen om reflog-entries op te schonen zodat de opslag niet onnodig vol raakt. Dit kan handig zijn als je afval van lange tijd wilt verwijderen of als jij gewoon je lokale repository fris wilt houden.
git reflog expire --expire=90.days.ago --all
git gc --prune=now --aggressive
Opmerking: --expire bepaalt hoe oud entries mogen zijn voordat ze uit de reflog verdwijnen. Je kan dit pad-aanpassen naar jouw behoefte, bijvoorbeeld 60.days.ago of 30.days.ago, afhankelijk van hoe lang je historie wilt bewaren.
Praktische use cases: wanneer reflog van pas komt
Het is één ding om de theorie te kennen, maar git reflog wordt pas waardevol wanneer je het in de praktijk gebruikt. Hier volgen enkele realistische scenario’s waarin reflog het verschil maakt.
1. Per ongeluk verwijderde commits terugvinden
Stel dat je per ongeluk een commit hebt verwijderd uit de reguliere tak. Je kunt de reflog gebruiken om de verwijzingspunt terug te vinden en vervolgens de commit terugzetten of herstellen. Zoek eerst de relevante entry in de reflog, kijk naar de bijbehorende hash, en voer daarna de gewenste herstelactie uit:
git reflog
# Zoek naar een entry die verwijst naar de gewenste staat
git reset --hard HEAD@{n} # waar n de juiste index uit reflog is
2. Een foutieve rebase ongedaan maken
Tijdens een rebase kan er iets misgaan en kun je twijfelen aan de voortgang van de operatie. In veel gevallen kun je terugkeren naar de toestand vóór de rebase met reflog:
git reflog
git reset --hard ORIG_HEAD
ORIG_HEAD is een speciale verwijzing die Git bijhoudt voordat een merge, rebase of reset begon. Als je de exacte toestand voor de rebase wilt herstellen, kun je dit handig combineren met reflog.
3. Verkeerde merge back-out zonder verlies van werk
Wanneer een merge een puinhoop blijkt te zijn, kan reflog je helpen om naar een stabiel punt terug te keren en vervolgens de merge opnieuw te proberen met minder conflicten:
git reflog
git merge --abort # als er een lopende merge is
git reset --hard HEAD@{n} # herstel naar een stabiel punt
4. Veranderingen naar een andere tak verplaatsen
Wel eens gedacht dat je per ongeluk op de verkeerde tak werkt? Met reflog kun je jouw werk meenemen naar de juiste tak:
git checkout main
git cherry-pick HEAD@{n}
Geavanceerde integraties: reflog en andere Git-tools
Git Reflog werkt niet op zichzelf. Het werkt goed samen met andere onderdelen van Git om een robuuste herstelstrategie te vormen. Hieronder staan enkele nuttige combinaties en praktijktrucs.
Reflog en Git-log: wat is het verschil?
git log toont de geschiedenis zoals het is vastgelegd in de huidige refs. git reflog toont daarentegen wat er daadwerkelijk is gebeurd aan HEAD en refs, inclusief stappen die later zijn herschreven of verwijderd uit de normale geschiedenis. In veel gevallen gebruik je ze samen: + git log -g –decorate geeft een grafische weergave van zowel de standaard geschiedenis als reflog-activiteiten.
git log --oneline --graph -n 20
git log -g --oneline --decorate -n 20
Hoe reflog te combineren met stash voor nog veiliger herstel
Wanneer je veel experimenten uitvoert, kan stash een veilige tussenoplossing bieden. Je kan altijd eerst een stash maken, daarna reflog gebruiken om terug te keren naar een vorige toestand en daarna de stash terughalen als dat nodig is:
git stash -u
# voer experimenten uit
git reflog
git reset --hard HEAD@{n}
git stash pop
Remote reflog: bestaat er zoiets?
Let op: reflog is per definitie lokaal. Er bestaat geen standaard remote reflog die het volledige gedrag van reflog weerspiegelt op een centrale server. Als jij wilt samenwerken aan herstel op afstand, moet je de acties in een gedeelde workflow expliciet documenteren, of gebruik maken van andere mechanismen zoals tags en branches om referenties te bewaren. Voor lokaal herstel is reflog echter onmisbaar en krachtig.
Best practices: effectief omgaan met git reflog
Wil je het maximale uit reflog halen? Hieronder een aantal best practices die je meteen kan toepassen in je dagelijkse workflow.
- Leer snel zoeken in de reflog: gebruik
git reflog --pretty=oneline --grep='om gericht te zoeken naar relevante gebeurtenissen.' - Beperk risico’s bij reset en force-push: gebruik eerst reflog om de juiste punt te lokaliseren, en voer daarna een graded reset uit in plaats van een directe force-push.
- Maak een herstelbranch aan voordat je ingrijpende acties uitvoert:
git checkout -b herstel-branch HEAD@{n}. - Beheer reflog-entries actief: stel een privébeleid in voor hoe lang je reflog-entries bewaart en voer periodiek
git reflog expireengit gcuit. - Documenteer belangrijkste herstelpunten: maak, zeker bij teams, duidelijke notities bij reflog-gestuurde herstelpunten zodat anderen weten wat is hersteld en waarom.
Veelgemaakte fouten en hoe ze te voorkomen
Zoals bij elk krachtig hulpmiddel bestaan er valkuilen bij het gebruik van git reflog. Hieronder staan de meest voorkomende fouten en hoe je ze vermijdt.
- Verkeerd aannemen dat reflog onbeperkt bewaard blijft. Controleer altijd de expiry-instellingen en zet zo nodig een reminder om oudere entries te verwijderen.
- Verwarren reflog-entry-nummers met commit-hashes. HEAD@{n} is een positie in de reflog, geen commit-id. Controleer het pad via
git reflogvoordat je reset. - Vergeten dat reflog lokaal is. Als je met een team werkt, hoeft reflog niet op de server aanwezig te zijn. Gebruik gezamenlijke workflows zoals branch-beheer en tagging voor samenwerking.
- Bij het herstellen per ongeluk een niet-gecontroleerde staat te overschrijven. Gebruik altijd eerst een aparte herstelbranch of een stash voordat je een harde reset uitvoert.
- Te snel plannen om op te schonen zonder back-up. Maak een snapshot van je staat voordat je opschoont met
git reflog expireengit gc.
Technische nuances en valkuilen
Er zijn enkele technische nuancepunten die handig zijn om te kennen als je dieper wilt duiken in Git Reflog.
- Reflog entries zijn per-repository en door alle gebruikers met dezelfde lokale instellingen te delen. Dit maakt reflog ideaal voor lokale herstel, maar niet voor auditieve zaken op afstand.
- Het openen van de reflog vereist geen speciale permissies; het is standaard beschikbaar voor elke lokale gebruiker van de repository.
- De grootte van de reflog en de retentieperiode zijn configureerbaar via Git-instellingen. Je kan dit nauwkeurig afstemmen op jouw ontwikkelingsworkflow.
- Bij samenwerking is het verstandig om vooraf beleid te bepalen voor wanneer reflog-entries verwijderd worden en welke herstelpunten publiekelijk worden gedeeld.
Zoekmachines en SEO: geïntegreerde git reflog in jouw tekst
Voor wie een blog of documentatie schrijft die scoort in Google voor “git reflog” en gerelateerde termen, zijn er enkele SEO-tips die logisch samenhangen met de inhoud hierboven:
- Gebruik “Git Reflog” in de koppen (H1/H2) en behoud “git reflog” in codeblokken en queries. Dit versterkt de relevantie zonder te overdrijven.
- Varieer met synoniemen en gerelateerde termen zoals “reflog-geschiedenis”, “HEAD-geschiedenis”, “ref history” en “reflog-expire”.
- Maak duidelijke, concrete voorbeelden met commands en beschrijvingen. Lange, informatieve passages ranken goed wanneer ze waarde bieden voor de lezer.
- Structuur met duidelijke H2 en H3-koppen zodat zoekmachines de inhoud goed kunnen indexeren en de lezer snel relevante secties kan vinden.
Samenvatting: waarom Git Reflog onmisbaar is voor elke ontwikkelaar
De reflog is het geheime wapen in je Git-arsenaal. Het biedt je een veilige, lokaal gebonden geschiedenis van alles wat er is gebeurd met HEAD en refs, waardoor je zelfs de grootste fouten kunt herstellen zonder te aarzelen. Of het nu gaat om terugkeren naar een vorige staat na een mislukte rebase, het terughalen van een verloren commit, of het saneren van oude referenties om ruimte te maken voor nieuwe experiments—git reflog staat paraat. Door weloverwogen gebruik en een paar best practices kun je je ontwikkelwerk efficiënter maken en bovendien schade voorkomen die anders onherstelbaar leek.
Heb je ooit een fout gemaakt die je met glans hebt hersteld dankzij Git Reflog? Deel gerust jouw scenario’s en ervaringen in de reacties. Zo kunnen anderen leren hoe zij reflog nog effectiever kunnen inzetten in hun eigen projecten.
Veelgestelde vragen over git reflog
Hier beantwoorden we snel enkele van de meest gestelde vragen over Git Reflog en git reflog.
- Wat is het verschil tussen git log en git reflog?
- Git log toont de projectgeschiedenis zoals vastgelegd door refs. Git Reflog registreert hoe refs veranderden (HEAD, branches) en bevat vaak informatie die verloren kan gaan in de reguliere log als er referenties worden herschreven of verwijderd.
- Hoe lang blijft een reflog-entry bewaard?
- De bewaarperiode is configureerbaar. Standaardbehoud is meestal ongeveer 90 dagen voor oudere entries, maar dit kan aangepast worden met
git reflog expire. - Kan reflog worden gedeeld met anderen?
- Nee, reflog is per repository en per gebruiker. Voor samenwerking kun je relevante commits of tags delen, maar reflog-entries blijven lokaal.
- Wat als de reflog is opgeruimd en ik een belangrijke staat kwijt ben?
- Als de entry nog beschikbaar is in de reflog, kun je terugkeren. Als de entries zijn verwijderd door expiry, kan herstel afhankelijk zijn van andere back-ups of van de alternatieve referenties die nog bestaan (bijv. remote branches of tags).