Git reflog

Git avancé

Amanda Crawford-Adamo

Software and Data Engineer

Qu'est-ce que Git Reflog ?

  1. Registre local de TOUTES les mises à jour des références du dépôt
  2. Le reflog est stocké localement sous le répertoire .git/logs/refs/heads/
  3. Consigne les changements des pointes de branches et la position de HEAD
  4. Sert de filet de sécurité pour nos opérations Git
  5. Aide à récupérer des changements ou suppressions accidentels

Exemple de graphe des changements dans l'historique Git

Git avancé

Git Reflog versus Git Log

Fonction Git Reflog Git Log
But Affiche les mises à jour et réécritures de références dans le dépôt local Affiche uniquement l'historique des validations
Portée Dépôt local seulement Dépôts local et distant
Contenu Toutes les mises à jour de ref (commits, resets, merges, etc.) Uniquement les commits
Persistance Temporaire (en général 90 jours) Permanente (fait partie de l'historique)
Cas d'usage Récupérer des commits perdus, comprendre les actions récentes Voir l'historique du projet, suivre le développement des fonctionnalités
Git avancé

Commandes Reflog

  • Affiche les données du journal et l'activité de HEAD
    git reflog
    git reflog show
    
  • Nettoyer les anciennes entrées ou celles inaccessibles
    git reflog expire
    
Git avancé

Structure de la sortie Reflog

Décomposition de la structure du texte de sortie de reflog

Exemple de sortie de reflog dans le terminal

Composant Description
short-hash Hachage abrégé du commit
ref Habituellement HEAD, peut être un nom de branche
index Position dans le reflog (0 = le plus récent)
action Type d'action (commit, reset, merge, etc.)
descriptions Description de l'action
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Git avancé

Filtrer : Since et Until

  • since = afficher les entrées à partir de ce moment

    git reflog --since "time-qualifer"
    
  • until = afficher les entrées jusqu'à ce moment

    git reflog --until "time-qualifer"
    
Utilisation
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
Git avancé

Récupérer des branches supprimées

Scénario

  • Création d'une branche appelée etl-feature
  • Validation des changements ETL dans cette branche
  • Suppression accidentelle de cette branche
  • Tous les changements de code sont perdus

Comment restaurer la branche etl-feature ?

Solution

  1. Repérer le hachage du commit à la pointe de la branche supprimée avec git reflog
  2. Utiliser git checkout pour déplacer HEAD vers ce hachage de commit
  3. Créer une nouvelle branche à partir du commit pointé par 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
Git avancé

Git Reset

  • Déplace HEAD vers l'objet commit spécifié.
  • Selon le type de reset, l'aire de travail et l'index sont mis à jour.
Type de reset Commande Effet sur le répertoire de travail Effet sur l'index
Soft git reset --soft <commit> Aucun changement Les changements restent indexés
Mixed (par défaut) git reset --mixed <commit> Aucun changement Les changements sont désindexés
Hard git reset --hard <commit> Changements abandonnés Changements abandonnés
Git avancé

Retrouver un commit perdu

Scénario

  • Les tests échouent après des commits et des rebase
  • Un commit inconnu a causé l'échec
  • Il faut revenir à un état passant

Comment revenir aux précédents changements du script ETL ?

Solution

  1. Trouver le hachage du commit supprimé avec Git Reflog
  2. Utiliser git reset pour revenir au commit où les tests passaient
git reflog
git reset --soft HEAD@{1}
Git avancé

Bons procédés

  • Puissant pour récupérer du code et des commits perdus
  • Rédigez des messages de commit descriptifs
  • Poussez vers le dépôt distant régulièrement
  • Soyez prudent avec les push forcés

Reflog est notre machine à remonter le temps locale quand on se trompe

Image d'une horloge qui remonte le temps

Git avancé

Passons à la pratique !

Git avancé

Preparing Video For Download...