Comment annuler git add avant un commit ?
Comment annuler git add avant un commit ?
Lors du développement avec Git, il est courant d’ajouter des fichiers au staging area avec git add et de réaliser ensuite qu’on a fait une erreur. Peut-être avez-vous ajouté des fichiers que vous ne vouliez pas commiter, ou vous avez involontairement ajouté des fichiers sensibles (mots de passe, tokens, clés privées).
Heureusement, Git offre plusieurs façons d’annuler un git add et de retirer les fichiers du staging area avant de les commiter.
1. Vérifier l’état du staging area
Avant d’annuler un git add, voyons d’abord ce qui est en attente de commit.
$ git status
Vous verrez quelque chose comme :
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: fichier1.js
modified: fichier2.js
new file: fichier3.txt
Changes not staged for commit:
(use "git checkout -- <file>..." to discard changes in working directory)
modified: fichier4.js
Les fichiers sous “Changes to be committed” sont ceux qui ont été ajoutés au staging area avec git add.
2. Annuler git add pour un fichier spécifique
Situation
Vous avez ajouté plusieurs fichiers avec git add, mais vous voulez retirer un seul fichier du staging area.
Solution avec git reset
$ git reset HEAD fichier1.js
Cette commande retire fichier1.js du staging area sans perdre les modifications. Le fichier revient à l’état “unstaged”.
Solution alternative avec git restore
Une façon plus moderne et plus intuitive :
$ git restore --staged fichier1.js
Cette commande fait exactement la même chose : elle retire le fichier du staging area.
Vérification :
$ git status
Vous verrez que fichier1.js est passé de “Changes to be committed” à “Changes not staged for commit”.
3. Annuler git add pour plusieurs fichiers spécifiques
Si vous voulez retirer plusieurs fichiers à la fois :
$ git reset HEAD fichier1.js fichier2.js
Ou avec git restore :
$ git restore --staged fichier1.js fichier2.js
4. Annuler tous les git add (unstager tous les fichiers)
Situation
Vous avez accidentellement ajouté tous les fichiers avec git add . et vous voulez tout retirer du staging area.
Solution avec git reset
$ git reset HEAD
Ou simplement :
$ git reset
Cette commande retire tous les fichiers du staging area, les ramenant à l’état “unstaged”.
Solution avec git restore
$ git restore --staged .
Cette commande fait la même chose : retirer tous les fichiers du staging area.
Vérification :
$ git status
Vous verrez maintenant une liste de fichiers sous “Changes not staged for commit” ou “Untracked files”.
5. Annuler git add avec wildcards (motifs)
Vous pouvez aussi utiliser des motifs pour retirer plusieurs fichiers :
Retirer tous les fichiers .js
$ git reset HEAD *.js
Retirer tous les fichiers d’un dossier spécifique
$ git reset HEAD src/
Cette commande retire tous les fichiers du dossier src/ du staging area.
6. Cas spécial : Vous avez ajouté des fichiers sensibles
Situation
Oh non ! Vous avez accidentellement ajouté un fichier .env avec vos tokens ou un fichier de configuration avec des mots de passe.
Solution immédiate
Retirez le fichier du staging area immédiatement :
$ git reset HEAD .env
Puis assurez-vous que ce fichier est ignoré pour le futur :
$ echo ".env" >> .gitignore
$ git add .gitignore
⚠️ Important
Si vous avez déjà commité et pushé le fichier sensible sur le serveur, il ne suffit pas de le retirer. Vous devez :
- Regénérer les tokens/mots de passe compromis
- Utiliser
git filter-branchougit-filter-repopour retirer le fichier de l’historique Git - Force push les changements
Mais c’est une autre histoire…
7. Différence entre git reset et git restore
Les deux commandes font le même travail, mais avec une syntaxe différente :
| Commande | Effet | Notes |
|---|---|---|
git reset HEAD fichier |
Retire du staging | Ancienne syntaxe (marche toujours) |
git restore --staged fichier |
Retire du staging | Nouvelle syntaxe (plus intuitive) |
git reset HEAD |
Retire tout du staging | Retrait en masse |
git restore --staged . |
Retire tout du staging | Alternative moderne |
Quelle syntaxe utiliser ?
git restore --staged: Préférez cette syntaxe si vous utilisez Git 2.23+ (plus claire et séparation des responsabilités)git reset HEAD: Syntaxe classique, marche sur toutes les versions de Git
8. Tableau récapitulatif
| Situation | Commande |
|---|---|
| Retirer un fichier du staging | git reset HEAD fichier ou git restore --staged fichier |
| Retirer plusieurs fichiers | git reset HEAD fichier1 fichier2 |
| Retirer tous les fichiers | git reset HEAD ou git reset |
Retirer tous les .js |
git reset HEAD *.js |
| Retirer tous les fichiers d’un dossier | git reset HEAD dossier/ |
| Retirer et garder la modification | Les deux commandes ci-dessus conservent les modifications |
9. Après avoir retiré du staging, que faire ?
Une fois que vous avez retiré les fichiers du staging area, vous avez plusieurs options :
Option 1 : Les modifier et les re-ajouter plus tard
$ git reset HEAD fichier.js
# ... modifiez le fichier
$ git add fichier.js
$ git commit -m "Mon message"
Option 2 : Ignorer complètement les changements
$ git reset HEAD fichier.js
$ git checkout fichier.js # Annule les modifications
Option 3 : Les commiter dans un commit séparé
$ git reset HEAD fichier.js
$ git add autre_fichier.js
$ git commit -m "Commit sans fichier.js"
$ git add fichier.js
$ git commit -m "Commit avec seulement fichier.js"
10. Éviter les erreurs futures
Pour éviter d’ajouter accidentellement des fichiers sensibles :
Créez un .gitignore robuste
# .gitignore
.env
.env.local
*.key
*.pem
config/database.yml
node_modules/
.DS_Store
Faites attention avec git add .
Au lieu d’utiliser git add . qui ajoute tout, soyez sélectif :
$ git add fichier1.js fichier2.js # Ajouter spécifiquement
$ git add src/ # Ajouter un dossier
Utilisez git status avant de commiter
Avant chaque commit, vérifiez toujours ce que vous allez commiter :
$ git status
$ git diff --staged # Voir les modifications en staging
$ git commit -m "Mon message"
Conclusion
Annuler un git add est une opération simple et sans risque. Git offre deux syntaxes équivalentes :
git reset HEAD [fichier]: Syntaxe classiquegit restore --staged [fichier]: Syntaxe moderne (Git 2.23+)
Les deux retirent les fichiers du staging area sans perdre les modifications. C’est une excellente pratique de vérifier votre staging area avec git status et git diff --staged avant de commiter.
Avec ces outils, vous avez le contrôle total sur ce qui va être inclus dans votre commit, et vous pouvez corriger rapidement toute erreur sans stress.
💡 Astuce finale : Vous pouvez créer un alias Git pour rendre la commande plus courte :
$ git config --global alias.unstage "reset HEAD"
# Maintenant vous pouvez faire :
$ git unstage fichier.js