Je vous ai décrit le reflog, mais je vous avais aussi parlé du combo reflog + reset. Voyons un exemple qui va nous permettre de faire un saut dans le passé et retourner ensuite vers le futur.

Toujours en partant de notre historique de 3 commits c1, c2 et c3, si je fais un git reset --keep c1, mes commits c2 et c3 sont déréférencés. Ça veut dire que mon log n’est plus en mesure de me les afficher.

On voit dans notre reflog que l’opération de reset est bien inscrite comme une nouvelle entrée puisqu’on a déplacé HEAD : « reset: moving to c1 ». Toujours à l’aide de notre reflog, si on cherche la position d’avant notre reset, on trouve c3 à la position HEAD@{1}. On peut donc annuler ce reset en utilisant l’une ou l’autre de ces références, par exemple : git reset --keep HEAD@{1}. Et magie ! N’est-ce pas formidable, on retrouve notre log tel qu’il était avant notre reset maladroit. 

Voyez enfin notre reflog qui a enregistré un nouveau mouvement de HEAD et qui retrace ainsi toutes nos manipulations. On pourrait donc « resetter le reset du reset » en faisant à nouveau un git reset --keep HEAD@{1}. On aurait alors fait un pas en arrière, un pas en avant, et encore un pas en arrière. Si c’est pas la classe à Dallas tout ça !

(Exemple 15-back-to-the-future)

Allez, je vous fais la même dans le terminal.

On a un historique de 3 commits, et pour m’entrainer à utiliser reset j’ai fait un git reset --keep <le SHA-1 du premier commit>.

Si je nettoie mon terminal et que j’affiche à nouveau mon log, je vois que seul le tout premier commit de mon historique est affiché. Le nettoyage de mon terminal fait que je ne peux pas feinter en reprenant les références des anciens commits dans le log que j’avais affichées précédemment. Je suis donc contraint de regarder mon reflog pour retrouver ma position précédente.

Je vais donc afficher les 3 dernières entrées de mon reflog : git reflog -3. Là je vois qu’en seconde entrée, donc en HEAD@{1} j’ai le commit sur lequel je me situais précédemment, celui intitulé « Ajout des fichiers modifiés ». Je vais donc pouvoir l’utiliser et faire un git reset --keep HEAD@{1}. Je revérifie mon log. Et sous vos applaudissements mesdames et messieurs, j’ai retrouvé mon historique dans son état précédent. Merci, merci !

”Git Undo” ou le savoir-défaire

Détendez-vous ! Avec Git, il est facile de récupérer un travail paumé et de vous sortir de toutes les situations délicates…