Git reflog

Geavanceerd Git

Amanda Crawford-Adamo

Software and Data Engineer

Wat is Git Reflog?

  1. Lokaal log van ALLE referentie-updates in je repository
  2. Reflog staat lokaal onder .git/logs/refs/heads/
  3. Registreert wijzigingen aan branchtips en HEAD-positie
  4. Werkt als vangnet voor Git-acties
  5. Helpt bij herstel van per ongeluk gemaakte wijzigingen of verwijderingen

Een voorbeeldgrafiek van wijzigingen in githistorie

Geavanceerd Git

Git Reflog versus Git Log

Functie Git Reflog Git Log
Doel Toont referentie-updates en herschrijvingen in lokale repo Toont alleen commitgeschiedenis
Scope Alleen lokale repository Lokale en remote repositories
Inhoud Alle ref-updates (commits, resets, merges, enz.) Alleen commits
Houdbaarheid Tijdelijk (meestal 90 dagen) Permanent (onderdeel van de historie)
Use case Verloren commits herstellen, recente acties begrijpen Projecthistorie bekijken, feature-ontwikkeling begrijpen
Geavanceerd Git

Reflog-commando's

  • Toont logdata en HEAD-activiteit
    git reflog
    git reflog show
    
  • Ruim oude of onbereikbare logs op
    git reflog expire
    
Geavanceerd Git

Structuur van reflog-uitvoer

Uitleg van de tekststructuur van de reflog-uitvoer

Voorbeeld van reflog-uitvoer in de terminal

Component Beschrijving
short-hash Afgekorte commit-hash
ref Meestal HEAD, maar kan ook branchnamen zijn
index Positie in de reflog (0 is meest recent)
action Type actie (commit, reset, merge, enz.)
descriptions Beschrijving van de actie
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Geavanceerd Git

Filteren: Since en Until

  • since = toon items vanaf dit tijdstip

    git reflog --since "time-qualifer"
    
  • until = toon items tot dit tijdstip

    git reflog --until "time-qualifer"
    
Gebruik
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
Geavanceerd Git

Verwijderde branches herstellen

Scenario

  • Een branch etl-feature aangemaakt
  • ETL-wijzigingen gecommit op deze branch
  • Per ongeluk deze branch verwijderd
  • Alle codewijzigingen kwijt

Hoe herstellen we de branch etl-feature?

Oplossing

  1. Vind de hash van de tip-commit van de verwijderde branch met git reflog
  2. Gebruik git checkout om HEAD naar die commit-hash te zetten
  3. Maak een nieuwe branch vanaf de commit waar HEAD nu op staat
git reflog
git checkout <hash>
git checkout -b <branch-name>
1 https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git
Geavanceerd Git

Git reset

  • Verplaatst HEAD naar een specifieke commit.
  • Afhankelijk van het reset-type worden werkmap en staging bijgewerkt.
Reset-type Commando Effect op werkmap Effect op staging
Soft git reset --soft <commit> Geen wijzigingen Wijzigingen blijven staged
Mixed (standaard) git reset --mixed <commit> Geen wijzigingen Wijzigingen worden unstaged
Hard git reset --hard <commit> Wijzigingen verworpen Wijzigingen verworpen
Geavanceerd Git

Een verloren commit vinden

Scenario

  • Tests falen na commits en rebases
  • Onbekende commit veroorzaakte de fout
  • Terug naar een werkende staat nodig

Hoe keren we terug naar de vorige ETL-scriptwijzigingen?

Oplossing

  1. Vind de verwijderde commit-hash met Git Reflog
  2. Gebruik git reset om terug te gaan naar de commit met geslaagde tests
git reflog
git reset --soft HEAD@{1}
Geavanceerd Git

Best practices

  • Krachtig om verloren code en commits te herstellen
  • Gebruik beschrijvende commitberichten
  • Push regelmatig naar remote
  • Wees voorzichtig met force-pushes

Reflog is onze lokale tijdmachine bij fouten

Een afbeelding van een klok die terug in de tijd gaat

Geavanceerd Git

Laten we oefenen!

Geavanceerd Git

Preparing Video For Download...