git reflog : votre gilet de sauvetage

git reflog : votre gilet de sauvetage

Je voudrais vous parler d’une petite commande git qui m’a sauvé la vie plusieurs fois déjà. Cette commande est : git reflog

git reflog

En appelant cette commande, git vous donnera accès aux derniers emplacements de votre HEAD et…c’est fort pratique.

Par exemple, imaginons que :
– vous soyez un développeur consciencieux mais parfois étourdi (toute ressemblance avec des situations existantes ou ayant existé ne serait que pur hasard)
– vous travaillez sur une branche feature et que comme dit plus haut, parce que vous êtes consciencieux, vous faites des git rebase régulièrement de la branche develop vers votre branche feature
– vous n’avez pas poussé votre branche feature

La situation pourrait ressembler à celle-ci concernant la branche develop :

Et à celle-ci sur la branche de la nouvelle feature :

En lançant git rebase tout se passe bien (ceci est un article donc cela se passe forcément bien) et on obtient quelque chose comme :

Or il y a un problème, vous vous rendez compte que vous avez rebasé la mauvaise branche (vous êtes étourdi rappelez-vous)…
Vous souhaitez donc revenir en arrière concernant votre branche new_feature i.e revenir sur le commit e91362182a via un git reset.
Seulement voilà…le SHA1, d’avant votre changement n’est plus visible !
En effet le commit dont le commentaire est change for new feature est maintenant 60e691574 et correspond à la fusion des deux branches.
Ainsi, à moins :
⁃ D’avoir une mémoire visuelle extraordinaire
⁃ de faire des captures d’écran régulières (#IloveScreenShots)
votre SHA1 initial semble avoir disparu et vous maudissez la terre entière.

Heureusement git reflog va nous sauver la vie :

Et la magie opère…la 4e ligne nous donne le numéro de commit (tant) recherché.
Il ne reste plus qu’à effectuer un git reset –hard e913621 :

Ainsi la peur qui « justifiait » le fait de ne pas rebaser régulièrement est évaporée 🙂 !!
De manière plus générale, git reflog permet d’annuler une action, entre autres :
⁃ merge
⁃ suppression involontaire de branche (#étourdi4Ever)
⁃ git reset –hard (la violence ultime)

Pour le dernier point par exemple si l’on relance git reflog on obtient :

Ainsi si notre git reset –hard nous semble finalement trop violent, on peut l’annuler en revenant sur 60e6915 (à l’aide donc d’un autre git reset –hard ;))
Cela a donc pour conséquence immédiate que la goutte de sueur le long de votre tempe avant un git reset –hard devrait disparaître, ce qui est non négligeable.

Point d’attention cependant : les commits non référencés ne restent que quelques jours en mémoire, une fois le garbage collector passé ceux-ci sont supprimés (et donc impossible de les retrouver).