Récupérer un stash droppé par erreur

Vous venez de drop un stash important, et de rage vous avez fermé votre terminal ?

Pas de panique, j’ai la suite de commandes qu’il vous faut !

Les étapes

Mais avant de vous donner la suite complète, je vais vous présenter les différentes commandes qui la composent.

1ère étape, retrouver les objets orphelins

Git est une base de données, qui contient différents objets (commit, branche, stash…), qui sont reliés entre eux. Mais quand on droppe un stash, revert un commit…, ces objets ne disparaissent pas tous de suite. Ils sont juste déconnectés du reste, et deviennent injoignables (unreachable, dans la langue de Guillaume Secoue-Poire).

Pour retrouver ces objets, la commande à utiliser est :

git fsck --unreachable

2ème étape, ne garder que le type d’objet qui nous intéresse

Dans notre cas, il s’agit d’objet de type ‘commit’, et pour trouver ces objets, un simple grep suffit :

grep commit

3ème étape, récupérer les hashs

Pour cela, AWK est votre ami.

Sur chaque ligne obtenue avec les commandes précédentes, les colonnes sont séparées par un espace (le défaut pour AWK), et la colonne qui nous intéressse est la troisième.

Cela donne donc :

awk '{print $3}'

4e étape, afficher les infos de chaque commit

Maintenant, il ne reste plus qu’à afficher les infos (date de création, message du stash) de chaque objet de type merge (pour git, un stash est un merge) :

xargs git log --merge

La commande complète

git fsck --unreachable | grep commit | awk '{print $3}' | xargs git log --merges

Comment récuper notre précieux stash ?

La suite de commande précédente nous a permis de retrouver le hash du stash effacé. Pour récupérer son contenu, il suffit de lancer :

git stash apply <hash>

Si on ne ferme pas tout de suite le terminal après avoir droppé le stash, le hash du stash est toujours affiché, et on peut directement lancer la commance ci-dessus avec le hash.

Et voilà !

J’espère que cet article pourra vous être utile, et vous éviter de devoir tout retaper.

Laisser un commentaire