Annuler git reset --hard avec le reflog
Ces blocs sont des cas différents, pas un script unique. Choisissez celui de votre dépôt. Remplacez branches, chemins et VERIFIED_COMMIT avant usage. Les commandes d’annulation concernent seulement leur opération active ; n’exécutez pas les deux alternatives.
Réponse courte
Après git reset --hard, retrouvez le commit précédent dans le reflog, vérifiez-le et créez une branche de secours. Son objet doit encore être conservé.
Exemple et conditions
Ce parcours récupère du travail commité. Le reflog ne conserve pas les modifications qui existaient uniquement dans le répertoire de travail.
Examiner avant de modifier
Évitez de nouveaux resets, rebases ou changements de branche. Lisez git reflog et inspectez git show avant de déplacer une référence.
git status --short
git reflog --date=iso
git show VERIFIED_COMMITGarder une référence ou un checkout séparé
Créez rescue/lost-work sur VERIFIED_COMMIT. Cette branche nomme le commit sans modifier votre branche actuelle ni écraser les fichiers de travail.
git branch rescue/lost-work VERIFIED_COMMIT
git log -5 --oneline rescue/lost-workPremier parcours
Examinez l’historique et le patch de la branche récupérée. Vous pouvez les revoir dans un autre checkout ou intégrer délibérément les changements voulus.
Choisir l’autre résultat consciemment
Un reset direct vers le commit récupéré modifie à nouveau la branche, l’index et les fichiers. Préservez d’abord vos modifications actuelles et une référence de secours.
Limites et exceptions
HEAD@{1} désigne une position du reflog, pas forcément le bon commit. ORIG_HEAD peut contenir l’ancienne pointe, mais d’autres opérations peuvent le remplacer.
Conflits et nettoyage
L’expiration du reflog et l’élagage des objets suivent des politiques configurables distinctes. Une ancienne entrée ne recrée pas un objet supprimé.
Vérifier le résultat
Vérifiez le commit, les fichiers et l’historique de la branche de secours. Exécutez les tests nécessaires avant d’intégrer ses modifications.
git show --stat rescue/lost-work
git status --shortQuestions fréquentes
git revert crée un commit inverse, sans replacer la branche avant le reset. Pour du contenu seulement indexé, git fsck peut retrouver des blobs, sans garantir noms ni arborescence.
Examiner l’opération dans FluxGit
FluxGit réunit mouvements du reflog et points de restauration dans Safety Timeline. Fonction activée et modifications locales détectées, un reset couvert peut créer un stash de sécurité ; le reset du terminal montré ici n’utilise pas cette protection.
Références officielles Git
Annuler git reset --hard : récupérer votre commit perdu
Récupérez une modification commitée après git reset --hard grâce au reflog local tant que l’objet du commit est conservé. La récupération n’est pas garantie après l’expiration du reflog ou le nettoyage des objets.
Regarder sur YouTube — ouvre un nouvel onglet
Enregistré dans un dépôt de test.
Lire la transcription de la narration
- Vous avez exécuté git reset --hard et votre dernier commit a disparu. Cela arrive à tout le monde une fois. Voici comment le récupérer et pourquoi cela fonctionne.
- D’abord, une modification déjà commitée : réessayer deux fois l’appel de paiement.
- Puis, dans un terminal : git reset --hard HEAD~1.
- FluxGit le détecte immédiatement. La branche est revenue en arrière et le commit n’en fait plus partie.
- Voici pourquoi il n’est pas perdu. Une branche n’est qu’une étiquette sur un commit. Le reset déplace l’étiquette en arrière, mais le commit reste dans le dépôt, et le reflog, le journal de Git, le répertorie toujours. Créez une branche sur ce commit et il est de retour.
- Dans FluxGit, Recover lost work l’explique simplement et vous conduit au bon endroit.
- La Safety Timeline décrit le reset en une phrase. À partir du moment qui le précède, créez une branche.
- Votre commit est de retour, sur sa propre branche.
- Le travail qui n’a pas été enregistré dans un commit n’apparaît pas dans le reflog. Si les points de restauration sont activés et que des modifications locales sont détectées, FluxGit peut enregistrer un stash de sécurité avant un reset hard. Ce reset exécuté directement dans le terminal Git contourne cette protection.
- La même chose dans le terminal : git reflog, trouvez la ligne précédant le reset et créez une branche sur ce commit.
- Récapitulatif. Un reset déplace une étiquette. Le reflog se souvient de son emplacement précédent. Créez une branche pour conserver le commit. Prochaine leçon : récupérer une branche supprimée.