Git reflog

Zaawansowany Git

Amanda Crawford-Adamo

Software and Data Engineer

Czym jest Git Reflog?

  1. Lokalna historia WSZYSTKICH aktualizacji referencji w repozytorium
  2. Reflog jest przechowywany w katalogu .git/logs/refs/heads/
  3. Rejestruje zmiany końców gałęzi i pozycji HEAD
  4. Stanowi zabezpieczenie operacji Git
  5. Pomaga odzyskać przypadkowe zmiany lub usunięcia

Przykładowy wykres zmian historii Git

Zaawansowany Git

Git Reflog a Git Log

Cecha Git Reflog Git Log
Cel Pokazuje aktualizacje i przepisania referencji w lokalnym repozytorium Pokazuje tylko historię commitów
Zakres Tylko lokalne repozytorium Lokalne i zdalne repozytoria
Zawartość Wszystkie aktualizacje ref (commity, resety, scalenia itp.) Tylko commity
Trwałość Tymczasowa (zwykle 90 dni) Trwała (część historii repozytorium)
Zastosowanie Odzyskiwanie utraconych commitów, analiza ostatnich działań Przeglądanie historii projektu, analiza rozwoju funkcji
Zaawansowany Git

Polecenia reflog

  • Wyświetla dane logu i aktywność HEAD
    git reflog
    git reflog show
    
  • Usuwa stare lub nieosiągalne wpisy logu
    git reflog expire
    
Zaawansowany Git

Struktura danych wyjściowych reflog

Struktura danych wyjściowych reflog

Przykład danych wyjściowych reflog w terminalu

Składnik Opis
short-hash Skrócony hash commita
ref Zazwyczaj HEAD, może być też nazwa gałęzi
index Pozycja w reflogu (0 = najnowsza)
action Typ akcji (commit, reset, merge itp.)
descriptions Opis akcji
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Zaawansowany Git

Filtrowanie: Since i Until

  • since = pokaż wpisy od tego momentu

    git reflog --since "time-qualifer"
    
  • until = pokaż wpisy do tego momentu

    git reflog --until "time-qualifer"
    
Użycie
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
Zaawansowany Git

Odzyskiwanie usuniętych gałęzi

Scenariusz

  • Utworzono gałąź etl-feature
  • Zatwierdzono zmiany ETL w tej gałęzi
  • Gałąź została przypadkowo usunięta
  • Wszystkie zmiany w kodzie zostały utracone

Jak przywrócić gałąź etl-feature?

Rozwiązanie

  1. Znajdź hash commita na czubku usuniętej gałęzi przy użyciu git reflog
  2. Użyj checkout, aby przenieść HEAD do tego hasha
  3. Utwórz nową gałąź w miejscu, na które wskazuje 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
Zaawansowany Git

Git Reset

  • Przenosi HEAD do określonego commita.
  • W zależności od typu resetu aktualizowany jest katalog roboczy i poczekalnia.
Typ resetu Polecenie Wpływ na katalog roboczy Wpływ na poczekalnię
Soft git reset --soft <commit> Bez zmian Zmiany pozostają w poczekalni
Mixed (domyślny) git reset --mixed <commit> Bez zmian Zmiany usunięte z poczekalni
Hard git reset --hard <commit> Zmiany są odrzucane Zmiany są odrzucane
Zaawansowany Git

Odnajdywanie zagubionego commita

Scenariusz

  • Testy zaczęły się nie powieść po commitach i rebase'ach
  • Nieznany commit spowodował błąd
  • Konieczny powrót do działającego stanu

Jak przywrócić poprzednie zmiany skryptu ETL?

Rozwiązanie

  1. Znajdź hash usuniętego commita za pomocą Git Reflog
  2. Użyj git reset, aby wrócić do commita z przechodzącymi testami
git reflog
git reset --soft HEAD@{1}
Zaawansowany Git

Najlepsze praktyki

  • Skuteczne narzędzie do odzyskiwania utraconego kodu i commitów
  • Używaj opisowych komunikatów commitów
  • Regularnie wysyłaj zmiany do zdalnego repozytorium
  • Ostrożnie korzystaj z force push

Reflog to lokalna maszyna czasu na wypadek pomyłek

Obraz zegara cofającego się w czasie

Zaawansowany Git

Czas na ćwiczenia!

Zaawansowany Git

Preparing Video For Download...