Git reflog

Avancerad Git

Amanda Crawford-Adamo

Software and Data Engineer

Vad är Git Reflog?

  1. Lokal logg över ALLA referensuppdateringar i vårt förråd
  2. Reflog lagras lokalt under .git/logs/refs/heads/
  3. Registrerar ändringar av grenar och HEAD-position
  4. Fungerar som ett skyddsnät för våra Git-operationer
  5. Hjälper till att återställa oavsiktliga ändringar eller raderingar

Exempelgraf över Git-historikändringar

Avancerad Git

Git Reflog jämfört med Git Log

Egenskap Git Reflog Git Log
Syfte Visar referensuppdateringar och omskrivningar i lokalt förråd Visar endast commit-historik
Räckvidd Endast lokalt förråd Lokala och fjärrförråd
Innehåll Alla ref-uppdateringar (commits, resets, merges, m.m.) Endast commits
Beständighet Tillfällig (vanligtvis 90 dagar) Permanent (del av förrådshistoriken)
Användningsfall Återställa förlorade commits, förstå senaste åtgärder Visa projekthistorik, förstå funktionsutveckling
Avancerad Git

Reflog-kommandon

  • Visar loggdata och HEAD-aktivitet
    git reflog
    git reflog show
    
  • Rensa gamla loggposter eller onåbara poster
    git reflog expire
    
Avancerad Git

Reflog-utdatans struktur

Förklaring av reflog-utdatans textstruktur

Exempel på reflog-utdata i terminalen

Komponent Beskrivning
short-hash Förkortad commit-hash
ref Vanligtvis HEAD, men kan vara grennamn
index Position i reflog (0 är den senaste)
action Typ av åtgärd (commit, reset, merge, m.m.)
descriptions Beskrivning av åtgärden
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Avancerad Git

Filtrering: Since och Until

  • since = visa poster från och med denna tidpunkt

    git reflog --since "time-qualifer"
    
  • until = visa poster fram till denna tidpunkt

    git reflog --until "time-qualifer"
    
Användning
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
Avancerad Git

Återställa raderade grenar

Scenario

  • Skapade en gren kallad etl-feature
  • Checkade in ETL-funktionsändringar på grenen
  • Vi raderade grenen av misstag
  • Alla kodändringar gick förlorade

Hur återställer vi grenen etl-feature?

Lösning

  1. Identifiera hashen för commit-spetsen på den raderade grenen med git reflog
  2. Använd git checkout för att flytta HEAD till commit-hashen för den raderade grenen
  3. Skapa en ny gren utifrån den commit som HEAD pekar på
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
Avancerad Git

Git Reset

  • Flyttar HEAD till det angivna commit-objektet.
  • Beroende på reset-typ uppdateras arbets- och stagingarea.
Reset-typ Kommando Effekt på arbetskatalogen Effekt på stagingarea
Soft git reset --soft <commit> Inga ändringar Ändringar förblir stagade
Mixed (standard) git reset --mixed <commit> Inga ändringar Ändringar tas bort från staging
Hard git reset --hard <commit> Ändringar tas bort Ändringar tas bort
Avancerad Git

Hitta en förlorad commit

Scenario

  • Tester började misslyckas efter commits och rebases
  • Okänd commit orsakade felet
  • Behöver återgå till ett fungerande tillstånd

Hur återgår vi till de tidigare ETL-skriptändringarna?

Lösning

  1. Hitta den förlorade commit-hashen med Git Reflog
  2. Använd git reset för att återgå till den commit där testerna fungerade
git reflog
git reset --soft HEAD@{1}
Avancerad Git

Bästa praxis

  • Kraftfullt verktyg för att återställa förlorad kod och commits
  • Använd beskrivande commit-meddelanden
  • Pusha till fjärrförrådet regelbundet
  • Var försiktig med force push

Reflog är vår lokala tidsmaskin när vi gör misstag

En bild av en klocka som går bakåt i tiden

Avancerad Git

Nu kör vi en övning!

Avancerad Git

Preparing Video For Download...