git reflog
Définition
La commande git reflog enregistre les mises à jour apportées aux références locales, telles que les branches, HEAD et les stashes. Elle vous permet de revenir à des commits, y compris ceux qui ne sont référencés par aucune branche ni aucun tag. Après une réécriture de l’historique, le reflog inclut des informations sur l’état précédent des références et permet de revenir à cet état si nécessaire.

Plusieurs commandes git acceptent un paramètre de référence (une « ref ») pour pointer vers un commit spécifique. Le mécanisme de reflog conserve l’historique des mises à jour de ces refs dans le dépôt local.
Utilisation de base de la commande git reflog
En général, git reflog s’utilise ainsi :
git reflog
git reflogC’est un raccourci pour ceci :
git reflog show HEAD
git reflog show HEADLa commande ci-dessus affiche le reflog de HEAD. Le résultat ressemble à ce qui suit :
commande git reflog
a32556a HEAD@{0}: commit: migrating content
ab371fd HEAD@{1}: commit: adding git reflog outline
23a491a HEAD@{2}: checkout: moving from stage to feature/solver
7b119cb HEAD@{3}: checkout: moving from feature/solver to stage
56a183a HEAD@{4}: commit: changing color scheme
7a2aa71 HEAD@{5}: commit: adding more color palettes
a56322b HEAD@{6}: commit: adding color tool packageRéférences du reflog
Par défaut, git reflog affiche le reflog de la référence HEAD, qui pointe vers la branche actuellement active. Vous pouvez accéder à une ref git en utilisant la syntaxe name@{qualifier}.
Exécutez la commande suivante pour obtenir le reflog complet de toutes les références :
git reflog show --all
git reflog show --allPassez le nom de la branche actuelle à git reflog show si vous voulez voir son reflog. Dans l’exemple ci-dessous, nous affichons le reflog de la branche test_branch.
git reflog show branch
git reflog show test_branch
#32a591f test_branch@{0}: commit: add snippets
#23bae4a test_branch@{1}: commit (initial): initial commitL’utilisation de la commande ci-dessous affichera le reflog d’un git stash: :
git reflog stash
git reflog stash
#0d44de3 stash@{0}: WIP on git_reflog: a567574 adding Vue.jsReflogs horodatés
Chaque entrée du reflog possède un horodatage associé. Ils peuvent être utilisés comme qualificateurs dans la syntaxe de pointeur de ref Git, ce qui vous permet de filtrer les reflogs Git par heure. Voici quelques exemples de qualificateurs temporels :
- 1.minute.ago
- 1.hour.ago
- 1.day.ago
- yesterday
- 1.week.ago
- 1.month.ago
- 1.year.ago
- 2011-05-17.09:00:00
Vous pouvez également combiner des qualificateurs temporels (par exemple, 1.week.3.hours.ago) et utiliser des formes plurielles (par exemple, 5.hours.ago). Les refs avec des qualificateurs temporels peuvent être passées à d’autres commandes git, comme ceci :
reflogs horodatés
git diff master@{0} master@{1.week.ago}Cette commande affiche un diff de la branche master actuelle par rapport à master d’il y a 1 semaine.
Sous-commandes de git reflog
Git reflog accepte plusieurs arguments qui agissent comme des sous-commandes. Elles sont décrites ci-dessous.
Afficher - sous-commande git reflog show
La sous-commande git reflog show est un alias de git log -g --abbrev-commit --pretty=oneline. C’est le comportement par défaut. Dans l’exemple suivant, les deux commandes sont équivalentes :
équivalence de git reflog show
git reflog master@{0}
git reflog show master@{0}Expirer - sous-commande git reflog expire
La sous-commande git reflog expire est utilisée pour nettoyer les anciennes entrées de reflog ou celles qui ne sont plus atteignables. En raison du risque de perte de données, cette sous-commande n’est généralement pas utilisée directement par les utilisateurs ; Git l’utilise en interne. Par défaut, les entrées du reflog expirent après 90 jours. Vous pouvez spécifier une durée d’expiration personnalisée à l’aide de l’argument --expire :
exemple de git reflog expire
git reflog expire --expire=1.day.agoSupprimer - sous-commande git reflog delete
La sous-commande git reflog delete est conçue pour supprimer des entrées spécifiques du reflog. Les utilisateurs finaux évitent généralement cette commande en raison du risque de perte de données, de la même manière que git reflog expire. Pour supprimer une entrée spécifique, vous pouvez passer sa référence :
exemple de git reflog delete
git reflog delete HEAD@{1}Récupérer des commits perdus
Les commits ne sont jamais vraiment perdus dans Git, même lors d’opérations de réécriture de l’historique. Voyons un exemple de git log --pretty=oneline qui ressemble à ceci :
Récupérer des commits perdus
2b43ceab309da94256db8fb1f35b1678fb74abd4 changes in content
c32557493a95185997c87e0bc3a9481715279351 adding Vue.js
abc234f986d270d7f97c77618314a06f024c4563 migrating content
a5673cd762d8ef2e146d7f0226e81a92f91956b1 adding git reflog outline
2bce4a4404c42128bee8468a9517418ed0ea412 initial commitSupposons maintenant que nous validions de nouvelles modifications dans ce dépôt et exécutons ce qui suit :
la commande git reflog
#make changes to HEAD
git commit -am "API changes"En conséquence, le journal ressemble maintenant à ceci :
définition de git reflog
37656e19d4e4f1a9b419f57850c8f1974f871b07 API changes
2b43ceab309da94256db8fb1f35b1678fb74abd4 changes in content
c32557493a95185997c87e0bc3a9481715279351 adding Vue.js
abc234f986d270d7f97c77618314a06f024c4563 migrating content
a5673cd762d8ef2e146d7f0226e81a92f91956b1 adding git reflog outline
2bce4a4404c42128bee8468a9517418ed0ea412 initial commitÀ ce stade, afin d’effectuer un rebase interactif sur la branche master, nous devons exécuter ce qui suit :
exemple de git reflog
git rebase -i origin/masterPendant le rebase, la sous-commande s du rebase marque les commits à écraser dans le commit le plus récent « API changes ». À la suite de cet écrasement des commits, la sortie de git log ressemble maintenant à ceci :
utilisation de git reflog
40d8a1237656e19d4e4f1a9b419f57850c8f1974 API changes
35aee4a4404c42128bee8468a9517418ed0eb3dc initial commitIl semble maintenant que les commits écrasés aient disparu. Si vous devez travailler sur un commit écrasé, vous pouvez exploiter le reflog.
description de git reflog
git reflog
37656e1 HEAD@{0}: rebase -i (finish): returning to refs/heads/git_reflog
37656e1 HEAD@{1}: rebase -i (start): checkout origin/master
37656e1 HEAD@{2}: commit: API changesIl existe des entrées de reflog pour le début et la fin du rebase, et avant celles-ci se trouve le commit « API changes ». La référence du reflog peut être passée à git reset afin de réinitialiser l’état à un commit antérieur au rebase.
git reset HEAD
git reset HEAD@{2}Cette commande déplacera HEAD vers ce commit « API changes » et restaurera les autres commits écrasés.
Practice
Quelles sont les affirmations correctes à propos de la commande `git reflog` telle que décrite dans le tutoriel Git de W3Docs ?