Tu as commit du mauvais code, ou tu as détruit ton arborescence par un mauvais reset --hard ? Cette leçon te montre les commandes de sauvetage, dans l'ordre du moins destructif au plus destructif.
Annuler des modifications non commitées
Si tu as modifié un fichier mais pas encore stagé, et que tu veux revenir à la version commitée :
Si tu as déjà stagé des modifications et que tu veux les déstaguer (sans perdre le contenu) :
Annuler un commit avec git revert (sûr)
git revert crée un nouveau commit qui inverse les effets du commit ciblé. L'historique est préservé, aucun commit existant n'est supprimé. C'est la méthode sûre, notamment si tu as déjà poussé.
HEAD désigne le dernier commit. Tu peux aussi passer un hash : git revert a3f5b6c.
Remonter dans l'historique avec git reset
git reset déplace le pointeur de branche vers un commit antérieur. Il existe trois modes, du moins au plus destructif :
Mode --soft : les commits sont annulés, les fichiers restent staged. Utile pour regrouper des commits.
Mode --mixed (défaut) : les commits sont annulés, les fichiers sont déstagés mais les modifications restent.
Mode --hard : les commits sont annulés et les modifications sont SUPPRIMÉES. Irrécupérable sans reflog.
Le filet de sécurité : git reflog
git reflog est ton dernier recours. Il liste tout ce que HEAD a pointé ces dernières semaines, même après un reset --hard. C'est la mémoire secrète de Git.
Tu vois une liste d'entrées avec des identifiants du type HEAD@{2}. Pour revenir à un état précis :
Récupérer un fichier depuis un ancien commit
Si tu veux seulement récupérer un fichier dans son état d'un commit précis, sans toucher au reste :
Le fichier revient dans son état du commit a3f5b6c, staged ou non selon tes options.
