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 :

  1. Regénérer les tokens/mots de passe compromis
  2. Utiliser git filter-branch ou git-filter-repo pour retirer le fichier de l’historique Git
  3. 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 ?


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 :

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

Rejoignez-nous