Aller au contenu

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.

git reflog

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

bash
git reflog

C’est un raccourci pour ceci :

git reflog show HEAD

bash
git reflog show HEAD

La commande ci-dessus affiche le reflog de HEAD. Le résultat ressemble à ce qui suit :

commande git reflog

bash
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 package

Ré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

bash
git reflog show --all

Passez 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

bash
git reflog show test_branch
#32a591f test_branch@{0}: commit: add snippets
#23bae4a test_branch@{1}: commit (initial): initial commit

L’utilisation de la commande ci-dessous affichera le reflog d’un git stash: :

git reflog stash

bash
git reflog stash
#0d44de3 stash@{0}: WIP on git_reflog: a567574 adding Vue.js

Reflogs 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

bash
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

bash
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

bash
git reflog expire --expire=1.day.ago

Supprimer - 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

bash
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

bash
2b43ceab309da94256db8fb1f35b1678fb74abd4 changes in content
c32557493a95185997c87e0bc3a9481715279351 adding Vue.js
abc234f986d270d7f97c77618314a06f024c4563 migrating content
a5673cd762d8ef2e146d7f0226e81a92f91956b1 adding git reflog outline
2bce4a4404c42128bee8468a9517418ed0ea412 initial commit

Supposons maintenant que nous validions de nouvelles modifications dans ce dépôt et exécutons ce qui suit :

la commande git reflog

bash
#make changes to HEAD
git commit -am "API changes"

En conséquence, le journal ressemble maintenant à ceci :

définition de git reflog

bash
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

bash
git rebase -i origin/master

Pendant 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

bash
40d8a1237656e19d4e4f1a9b419f57850c8f1974 API changes
35aee4a4404c42128bee8468a9517418ed0eb3dc initial commit

Il 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

bash
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 changes

Il 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

bash
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 ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.