Git Reflog

Fortgeschrittenes Git

Amanda Crawford-Adamo

Software and Data Engineer

Was ist Git Reflog?

  1. Lokales Protokoll von ALLEN Referenz-Updates im Repository
  2. Reflog liegt lokal unter .git/logs/refs/heads/
  3. Zeichnet Änderungen an Branch-Spitzen und der HEAD-Position auf
  4. Dient als Sicherheitsnetz für unsere Git-Operationen
  5. Hilft, versehentliche Änderungen oder Löschungen wiederherzustellen

Ein Beispielgraph für Änderungen im Git-Verlauf

Fortgeschrittenes Git

Git Reflog vs. Git Log

Feature Git Reflog Git Log
Zweck Zeigt Referenz-Updates und -Umschreibungen im lokalen Repo Zeigt nur die Commit-Historie
Umfang Nur lokales Repository Lokale und Remote-Repositories
Inhalt Alle Ref-Updates (Commits, Resets, Merges etc.) Nur Commits
Persistenz Temporär (meist 90 Tage) Dauerhaft (Teil der Repo-Historie)
Use Case Verlorene Commits retten, jüngste Aktionen verstehen Projektverlauf ansehen, Feature-Entwicklung verstehen
Fortgeschrittenes Git

Reflog-Befehle

  • Zeigt Log-Daten und HEAD-Aktivität
    git reflog
    git reflog show
    
  • Alte oder unerreichbare Einträge bereinigen
    git reflog expire
    
Fortgeschrittenes Git

Struktur der Reflog-Ausgabe

Aufschlüsselung der Textstruktur der Reflog-Ausgabe

Beispiel für Reflog-Ausgabe im Terminal

Komponente Beschreibung
short-hash Abgekürzter Commit-Hash
ref Meist HEAD, kann aber auch Branch-Namen sein
index Position im Reflog (0 ist der neueste)
action Aktionstyp (commit, reset, merge etc.)
descriptions Beschreibung der Aktion
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Fortgeschrittenes Git

Filtern: since und until

  • since = Einträge ab diesem Zeitpunkt anzeigen

    git reflog --since "time-qualifer"
    
  • until = Einträge bis zu diesem Zeitpunkt anzeigen

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

Gelöschte Branches wiederherstellen

Szenario

  • Einen Branch etl-feature erstellt
  • ETL-Änderungen in diesen Branch committet
  • Branch versehentlich gelöscht
  • Alle Codeänderungen verloren

Wie stellen wir den Branch etl-feature wieder her?

Lösung

  1. Den Hash des Commits an der Spitze des gelöschten Branches mit git reflog finden
  2. Mit git checkout HEAD auf diesen Commit-Hash bewegen
  3. Einen neuen Branch aus dem Commit erstellen, auf den HEAD zeigt
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
Fortgeschrittenes Git

Git Reset

  • Bewegt HEAD auf das angegebene Commit-Objekt.
  • Je nach Reset-Typ werden Arbeitsverzeichnis und Staging-Bereich aktualisiert.
Reset-Typ Befehl Effekt auf das Arbeitsverzeichnis Effekt auf den Staging-Bereich
Soft git reset --soft <commit> Keine Änderungen Änderungen bleiben gestaged
Mixed (Standard) git reset --mixed <commit> Keine Änderungen Änderungen werden entstaged
Hard git reset --hard <commit> Änderungen werden verworfen Änderungen werden verworfen
Fortgeschrittenes Git

Einen verlorenen Commit finden

Szenario

  • Tests schlagen nach Commits und Rebases fehl
  • Unbekannter Commit hat das verursacht
  • Wir müssen auf einen funktionierenden Stand zurück

Wie kommen wir zu den vorherigen ETL-Skript-Änderungen zurück?

Lösung

  1. Den gelöschten Commit-Hash mit Git Reflog finden
  2. Mit git reset auf den Commit mit bestandenen Tests zurücksetzen
git reflog
git reset --soft HEAD@{1}
Fortgeschrittenes Git

Best Practices

  • Stark zum Wiederherstellen verlorenen Codes und Commits
  • Aussagekräftige Commit-Nachrichten verwenden
  • Regelmäßig ins Remote pushen
  • Vorsicht bei Force-Pushes

Reflog ist unsere lokale Zeitmaschine, wenn wir Fehler machen

Ein Bild einer Uhr, die in der Zeit zurückgeht

Fortgeschrittenes Git

Lass uns üben!

Fortgeschrittenes Git

Preparing Video For Download...