Noël est passé mais j'ai un petit cadeau pour vous ! un git gift 😅
Une petite commande git qui peut vous sauvez la vie... du moins celle de votre pauvre petit commit esseulé, perdu dans votre historique !
Cette commande est la commande reflog.
Elle n’apparaît généralement pas sur les programmes des organismes de formation.
Pourtant, il est très utile d'au moins connaitre son existence.
Elle permet de récupérer l'historique des commandes git qui ont été exécutées en local.
Pourquoi c'est utile ? Principalement, pour récupérer un commit "perdu" !
Lors de mes formations, je l'évoque systématiquement pour faire comprendre que contrairement à ce que la majorité des développeurs pensent, il est rare de "perdre" un commit.
Les commits que l'on pense avoir perdus sont en général cachés car plus référencés par une branche ou un tag.
Mais voyons ça sur un exemple !
Supposons que l’on ait cet historique :
7e0e42a | (HEAD -> dev) Commit 4
a8738c8 | (master) Commit 3
48d7a1e | Commit 2
d432c7a | Commit 1
On est sur la branche dev qui a un commit en plus par rapport à la branche master.
Supposons maintenant qu’on veuille annuler le Commit 4 et remettre dev au même niveau que master.
$ git reset —hard HEAD~
On se retrouve alors avec cette historique :
a8738c8 | (HEAD -> dev, master) Commit 3
48d7a1e | Commit 2
d432c7a | Commit 1
Bon, maintenant supposons que vous avez fait plein de choses intelligentes sur votre terminal (à base de ls, de cd et de ping comme on voit dans les bons films de hackers 😅), que vous avez redémarré votre PC, que vous êtes parti promener votre chien, et que pendant votre balade votre maison a brûlé...
Heureusement vous êtes parti avec votre PC sous le bras mais là c’est le drame !
Vous vous rendez compte qu’il ne fallait pas annuler le commit 4 ! Aïe !
(Évidemment, j’exagère un peu. Redémarrer son PC est bien plus dramatique que de perdre un commit 🤣)
C’est là que super reflog intervient ! 🦸♂️
Si vous tapez cette commande vous aurez une sortie semblable à ça :
$ git reflog
a8738c8 (HEAD -> dev, master) HEAD@{0}: reset: moving to HEAD~ 7e0e42a HEAD@{1}: commit: Commit 4
a8738c8 HEAD@{2}: checkout: moving from master to dev
a8738c8 HEAD@{3}: commit: Commit 3
48d7a1e HEAD@{4}: commit: Commit 2
d432c7a HEAD@{5}: commit (initial): Commit 1
L’ensemble des actions git que vous avez effectuées y sont tracées et pour chacune d’elles, vous retrouvez le SHA-1 du commit correspondant.
Ainsi, vous retrouvez facilement le SHA-1 du commit 4 et vous pouvez remettre la branche dev (ou une nouvelle branche) dessus.
$ git reset —hard 7e0e42a
Et on retombe sur le même historique que précédemment !
Fastoche nan ??!
Et là je vous vois venir avec vos gros souliers de papa Noël et me dire :
Mais où est-ce que c’est que git stocke cette information ??
Encore plus fastoche !
Dans ton... .git bien sûr !
Dans le répertoire .git/, il y a un répertoire logs dans lequel l’historique des commandes git est enregistré pour le HEAD mais également pour chacune des branches.
$ tree .git/logs
.git/logs
├── HEAD
└── refs
└── heads
├── dev
└── master
Vous pouvez donc également utiliser la commande reflog en spécifiant une branche pour plus facilement extraire l’information dont vous avez besoin.
$ git reflog master
a8738c8 (master) master@{0}: commit: Commit 3
48d7a1e master@{1}: commit: Commit 2
d432c7a master@{2}: commit (initial): Commit 1
Alors ? Pas mal ce cadeau non ?
Comments