Git School · FluxGit

Annuler git reset --hard avec le reflog

FluxGit ·

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_COMMIT

Garder 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-work

Premier 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 --short

Questions 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

Git School · 1:50

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.

Annuler git reset --hard : récupérer votre commit perdu
Narration en anglais. Des sous-titres manuels sont disponibles sur YouTube dans 11 langues. Cette transcription est en français.

Regarder sur YouTube — ouvre un nouvel onglet

Enregistré dans un dépôt de test.

Lire la transcription de la narration
  1. 00:03 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.
  2. 00:12 D’abord, une modification déjà commitée : réessayer deux fois l’appel de paiement.
  3. 00:19 Puis, dans un terminal : git reset --hard HEAD~1.
  4. 00:24 FluxGit le détecte immédiatement. La branche est revenue en arrière et le commit n’en fait plus partie.
  5. 00:31 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.
  6. 00:47 Dans FluxGit, Recover lost work l’explique simplement et vous conduit au bon endroit.
  7. 00:59 La Safety Timeline décrit le reset en une phrase. À partir du moment qui le précède, créez une branche.
  8. 01:06 Votre commit est de retour, sur sa propre branche.
  9. 01:10 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.
  10. 01:26 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.
  11. 01:34 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.

Parcours associés

Télécharger FluxGit