Dans la plupart des cas, oui.
Selon l'état dans lequel se trouvait votre référentiel lorsque vous avez exécuté la commande, les effets de git reset --hard
peuvent varier de triviaux à annuler, voire fondamentalement impossibles.
Ci-dessous, j'ai énuméré une gamme de différents scénarios possibles et comment vous pouvez en récupérer.
Tous mes changements ont été validés, mais maintenant les validations ont disparu!
Cette situation se produit généralement lorsque vous exécutez git reset
avec un argument, comme dansgit reset --hard HEAD~
. Ne vous inquiétez pas, c'est facile à récupérer!
Si vous venez de courir git reset
et n'avez rien fait d'autre depuis, vous pouvez revenir où vous étiez avec ce one-liner:
git reset --hard @{1}
Cela réinitialise votre branche actuelle quel que soit l'état dans lequel elle se trouvait avant la dernière modification (dans votre cas, la modification la plus récente de la branche serait la réinitialisation matérielle que vous essayez d'annuler).
Si, cependant, vous avez apporté d'autres modifications à votre branche depuis la réinitialisation, le one-liner ci-dessus ne fonctionnera pas. Au lieu de cela, vous devez exécuter pour voir une liste de toutes les modifications récentes apportées à votre branche (y compris les réinitialisations). Cette liste ressemblera à ceci:git reflog
<branchname>
7c169bd master@{0}: reset: moving to HEAD~
3ae5027 master@{1}: commit: Changed file2
7c169bd master@{2}: commit: Some change
5eb37ca master@{3}: commit (initial): Initial commit
Recherchez l'opération dans cette liste que vous souhaitez "annuler". Dans l'exemple ci-dessus, ce serait la première ligne, celle qui dit "reset: passer à HEAD ~". Copiez ensuite la représentation du commit avant (ci-dessous) cette opération. Dans notre cas, ce serait master@{1}
(ou 3ae5027
, ils représentent tous deux le même commit), et exécutezgit reset --hard <commit>
pour réinitialiser votre branche actuelle sur ce commit.
J'ai organisé mes changements avec git add
, mais jamais engagé. Maintenant, mes changements ont disparu!
C'est un peu plus difficile à récupérer. git possède des copies des fichiers que vous avez ajoutés, mais comme ces copies n'ont jamais été liées à un commit particulier, vous ne pouvez pas restaurer les modifications d'un coup. Au lieu de cela, vous devez localiser les fichiers individuels dans la base de données de git et les restaurer manuellement. Vous pouvez le faire en utilisantgit fsck
.
Pour plus de détails à ce sujet, voir Annuler la réinitialisation de git --hard avec des fichiers non validés dans la zone de transfert .
J'ai eu des modifications de fichiers dans mon répertoire de travail avec lesquelles je n'ai jamais mis en scène git add
et jamais commis. Maintenant, mes changements ont disparu!
Euh oh. Je déteste te dire ça, mais tu n'as probablement pas de chance. git ne stocke pas les modifications que vous n'y ajoutez pas ou ne vous engagez pas, et selon la documentation degit reset
:
--difficile
Réinitialise l'index et l'arborescence de travail. Toutes les modifications apportées aux fichiers suivis dans l'arborescence de travail depuis <commit>
sont ignorées.
Il est possible que vous puissiez récupérer vos modifications avec une sorte d'utilitaire de récupération de disque ou un service de récupération de données professionnel, mais à ce stade, c'est probablement plus de problèmes que cela ne vaut.