Arbre de decision : que voulez-vous annuler ?
La bonne commande Git pour annuler depend de l'emplacement de vos modifications dans le workflow Git. Posez-vous trois questions : est-ce commite ? Est-ce pushe ? Est-ce indexe ? La reponse vous oriente vers la bonne commande.
Fichiers modifies dans le repertoire de travail
Vous avez modifie des fichiers mais n'avez pas encore lance git add.
Utilisez git restore ou git clean
Fichiers ajoutes a la zone d'indexation
Vous avez lance git add mais n'avez pas encore commite.
Utilisez git restore --staged
Commits locaux uniquement
Vous avez commite mais les modifications sont encore sur votre machine.
Utilisez git reset
Modifications partagees avec l'equipe
Le commit est sur le depot distant. Reecrire l'historique causerait des problemes.
Utilisez git revert
Mettre de cote temporairement
Vous voulez mettre de cote votre travail en cours et y revenir plus tard.
Utilisez git stash
Recuperer apres une operation destructive
Vous avez lance reset --hard ou supprime une branche et devez recuperer.
Utilisez git reflog
Annuler des modifications non commitees
Ces commandes agissent sur votre repertoire de travail : les fichiers que vous avez modifies mais pas encore commites. C'est le scenario d'annulation le plus simple : vous avez change quelque chose et vous voulez revenir a la derniere version commitee.
git restore — Annuler les modifications d'un fichier
git restore <fichier> remet un fichier dans son dernier etat commite. Toutes les modifications non commitees de ce fichier sont supprimees. Utilisez git restore . pour annuler toutes les modifications de tous les fichiers d'un coup. C'est le remplacement moderne de git checkout -- <fichier>.
Attention : cette operation est irreversible. Une fois le fichier restaure, les modifications supprimees sont perdues : elles n'avaient jamais ete commitees, donc Git n'en a aucune trace.
git clean — Supprimer les fichiers non suivis
git restore ne fonctionne que sur les fichiers suivis. Pour les fichiers non suivis (nouveaux fichiers que Git ne connait pas), vous avez besoin de git clean. Le flag -n effectue un essai a blanc pour previsualiser ce qui serait supprime. Le flag -f supprime reellement les fichiers, et -d inclut les repertoires.
Lancez toujours git clean -n d'abord. Comme git restore, cette commande est irreversible pour les fichiers non suivis : ils n'ont jamais ete commites.
Annuler des modifications indexees
Vous avez lance git add et un fichier se trouve maintenant dans la zone d'indexation, pret a etre commite. Mais vous avez change d'avis : vous voulez le desindexer sans perdre vos modifications.
git restore --staged — Desindexer sans perdre les modifications
git restore --staged <fichier> retire un fichier de la zone d'indexation et le remet a l'etat "modifie mais non indexe". Vos modifications dans le fichier sont conservees : seule l'indexation est annulee. C'est le remplacement moderne de git reset HEAD <fichier>.
Vous pouvez aussi combiner les deux flags : git restore --staged --worktree <fichier> desindexe le fichier et supprime les modifications en une seule operation.
Annuler des commits locaux
Vous avez commite mais pas encore pushe. Comme le commit n'existe que sur votre machine, vous pouvez reecrire l'historique en toute securite sans affecter personne d'autre. L'outil pour cela est git reset.
git reset — Deplacer HEAD en arriere
git reset deplace le pointeur de branche (HEAD) vers un commit precedent. Ce qui arrive aux fichiers depend du mode choisi :
--soft— Annule le commit. Les modifications restent indexees (dans l'index). A utiliser quand vous voulez modifier ou decouper un commit.--mixed(defaut) — Annule le commit et l'indexation. Les modifications restent dans votre repertoire de travail. A utiliser pour reselectionner les fichiers a inclure.--hard— Annule tout : commit, indexation et modifications du repertoire de travail. A utiliser avec une extreme prudence : c'est destructif.
git reset --soft : garder les modifications indexees
git reset --mixed : garder les modifications non indexees
git reset --hard : tout supprimer
Annuler des commits pushes
Une fois qu'un commit a ete pushe, il est partage avec l'equipe. Reecrire l'historique avec git reset causerait des problemes a toutes les personnes ayant deja fait un pull. L'approche sure est git revert.
git revert — Creer un commit inverse
git revert <hash> cree un nouveau commit qui fait exactement l'inverse du commit specifie. Si le commit original a ajoute une ligne, le revert la supprime. S'il a supprime un fichier, le revert le restaure. Le commit original reste dans l'historique : rien n'est reecrit.
C'est la seule methode sure pour annuler un commit sur une branche partagee. Apres le revert, vous pushez simplement le nouveau commit et vos collegues le recuperent sans conflits.
Sauvegarder temporairement son travail
Parfois, vous ne voulez pas annuler vos modifications, mais les mettre de cote un moment. Peut-etre devez-vous changer de branche pour un correctif urgent, ou vous voulez un repertoire de travail propre sans perdre votre progression.
git stash — Mettre de cote pour plus tard
git stash prend toutes vos modifications non commitees (indexees et non indexees) et les sauvegarde dans une pile. Votre repertoire de travail redevient propre. Plus tard, git stash pop restaure le dernier stash et le retire de la pile. Utilisez git stash apply a la place si vous voulez conserver le stash pour le reutiliser.
Astuce utile : git stash -u inclut les fichiers non suivis dans le stash. Et git stash list affiche tous les stashes sauvegardes pour gerer plusieurs contextes de travail en cours.
Recuperer des commits perdus
Vous avez lance git reset --hard par accident ? Supprime une branche ? Pas de panique. Si les commits ont existe, Git les conserve encore, pendant au moins 90 jours. L'outil pour les retrouver est git reflog.
git reflog — Le filet de securite de Git
git reflog affiche un journal chronologique de chaque position ou HEAD s'est trouve : commits, resets, checkouts, rebases, tout. Meme si un commit n'apparait plus dans git log, il sera dans le reflog. Trouvez le hash dont vous avez besoin et faites un reset ou un cherry-pick pour le recuperer.
Pensez au reflog comme a l'historique d'annulation de Git. Il ne suit pas les modifications au niveau des fichiers, mais les positions successives de HEAD. C'est le filet de securite ultime pour recuperer de pratiquement n'importe quelle erreur.
Voila qui couvre chaque scenario d'annulation dans Git. Le point cle a retenir : presque rien n'est vraiment perdu dans Git. Entre restore, reset, revert, stash et reflog, il y a toujours un moyen de revenir a un etat correct. Faites defiler pour voir un comparatif cote a cote de toutes les methodes.