Git reflog

Advanced Git

Amanda Crawford-Adamo

Software and Data Engineer

Co je Git Reflog?

  1. Lokální záznam VŠECH aktualizací referencí v repozitáři
  2. Reflog je uložen lokálně v adresáři .git/logs/refs/heads/
  3. Zaznamenává změny vrcholů větví a pozice HEAD
  4. Slouží jako ochrana před chybami v Gitu
  5. Pomáhá obnovit náhodně ztracené změny nebo smazané objekty

Ukázkový graf změn v historii Gitu

Advanced Git

Git Reflog vs. Git Log

Vlastnost Git Reflog Git Log
Účel Zobrazuje aktualizace referencí a přepisy v lokálním repozitáři Zobrazuje pouze historii commitů
Rozsah Pouze lokální repozitář Lokální i vzdálené repozitáře
Obsah Všechny aktualizace referencí (commity, resety, merges atd.) Pouze commity
Trvalost Dočasný (obvykle 90 dní) Trvalý (součást historie repozitáře)
Použití Obnova ztracených commitů, přehled nedávných akcí Zobrazení historie projektu, vývoj funkcí
Advanced Git

Příkazy Reflog

  • Zobrazí log a aktivitu HEAD
    git reflog
    git reflog show
    
  • Vyčistí staré nebo nedosažitelné záznamy logu
    git reflog expire
    
Advanced Git

Struktura výstupu Reflog

Popis struktury výstupu reflogu

Ukázka výstupu reflogu v terminálu

Komponenta Popis
short-hash Zkrácený hash commitu
ref Obvykle HEAD, ale může být i název větve
index Pozice v reflogu (0 je nejnovější)
action Typ akce (commit, reset, merge atd.)
descriptions Popis akce
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Advanced Git

Filtrování: Since a Until

  • since = zobrazit záznamy od tohoto bodu v čase

    git reflog --since "time-qualifer"
    
  • until = zobrazit záznamy do tohoto bodu v čase

    git reflog --until "time-qualifer"
    
Použití
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
Advanced Git

Obnovení smazaných větví

Scénář

  • Vytvořili jsme větev etl-feature
  • Commitli jsme změny ETL do této větve
  • Větev jsme omylem smazali
  • Všechny změny kódu byly ztraceny

Jak obnovit větev etl-feature?

Řešení

  1. Najděte hash commitu na vrcholu smazané větve pomocí git reflog
  2. Přesuňte HEAD na tento hash pomocí git checkout
  3. Vytvořte novou větev z aktuální pozice HEAD
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
Advanced Git

Git Reset

  • Přesune HEAD na zadaný commit.
  • Podle typu resetu se aktualizuje pracovní adresář a staging area.
Typ resetu Příkaz Efekt na pracovní adresář Efekt na staging area
Soft git reset --soft <commit> Žádné změny Změny zůstávají ve staging
Mixed (výchozí) git reset --mixed <commit> Žádné změny Změny jsou odstraněny ze staging
Hard git reset --hard <commit> Změny jsou zahozeny Změny jsou zahozeny
Advanced Git

Nalezení ztraceného commitu

Scénář

  • Po commitech a rebase začaly testy selhávat
  • Neznámý commit způsobil chybu
  • Je třeba vrátit se do funkčního stavu

Jak se vrátit k předchozím změnám ETL skriptu?

Řešení

  1. Najděte hash ztraceného commitu pomocí Git Reflog
  2. Použijte git reset k návratu na commit s úspěšnými testy
git reflog
git reset --soft HEAD@{1}
Advanced Git

Doporučené postupy

  • Výkonný nástroj pro obnovu ztraceného kódu a commitů
  • Používejte popisné zprávy commitů
  • Pravidelně pushujte na remote
  • Buďte opatrní s force push

Reflog je náš lokální stroj času při chybách

Obrázek hodin jdoucích pozpátku

Advanced Git

Lass uns üben!

Advanced Git

Preparing Video For Download...