Aller au contenu
Développement medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Staging interactif avec git add -p

8 min de lecture

git add -p vous permet de choisir quelles lignes vont dans le prochain commit, hunk par hunk. Au lieu de stager un fichier entier, vous sélectionnez précisément les modifications pertinentes. C’est l’outil essentiel pour des commits atomiques et un historique propre.

Prérequis : Enregistrer des modifications et Sélection de révisions.

  • Utiliser git add -p pour fragmenter vos modifications en commits atomiques
  • Éditer un hunk manuellement quand les découpages automatiques ne conviennent pas
  • Désindexer sélectivement avec git reset -p
  • Produire des commits propres qui passent la revue de code sans friction

Vous travaillez sur un fichier et vous avez fait deux changements indépendants : un correctif de bug et un refactoring. Committer les deux ensemble produit un commit confus. Le staging interactif résout ce problème :

  • Commits atomiques : chaque commit contient un seul changement logique
  • Historique lisible : facilite le git bisect et le code review
  • Réversibilité : un commit ciblé se revert sans dommage collatéral

La commande la plus utilisée. Elle parcourt chaque « hunk » (bloc de modifications) et vous demande quoi en faire :

Fenêtre de terminal
git add -p

Git affiche chaque hunk avec un prompt :

@@ -10,6 +10,8 @@ def calculate_price(quantity, unit_price):
total = quantity * unit_price
+ # Appliquer la remise si > 100 articles
+ if quantity > 100:
+ total *= 0.9
return total
(1/3) Stage this hunk [y,n,q,a,d,s,e,?]?
OptionAction
yYes — stager ce hunk
nNo — ignorer ce hunk
qQuit — quitter (les hunks déjà stagés le restent)
aAll — stager ce hunk et tous les suivants du fichier
dDon’t — ignorer ce hunk et tous les suivants du fichier
sSplit — découper en hunks plus petits
eEdit — éditer manuellement le hunk
?Afficher l’aide
  1. Modifiez un fichier avec plusieurs changements logiquement distincts.

  2. Lancez le staging interactif :

    Fenêtre de terminal
    git add -p fichier.py
  3. Pour chaque hunk, répondez y (stager) ou n (ignorer).

  4. Commitez les modifications stagées :

    Fenêtre de terminal
    git commit -m "fix: corriger le calcul de remise"
  5. Recommencez git add -p pour le changement suivant :

    Fenêtre de terminal
    git add -p fichier.py
    git commit -m "refactor: extraire la fonction de remise"

Si un hunk contient des modifications trop proches, s le découpe en sous-blocs. Git peut splitter uniquement si des lignes non modifiées séparent les changements :

Stage this hunk [y,n,q,a,d,s,e,?]? s
Split into 2 hunks.

Si s ne peut pas splitter davantage (modifications sur des lignes adjacentes), utilisez e pour éditer manuellement.

L’option e ouvre le hunk dans votre éditeur. Vous pouvez alors supprimer des lignes + que vous ne voulez pas stager :

# Manual hunk edit mode
# Pour retirer une ligne ajoutée du staging : supprimez la ligne
# Pour garder une ligne supprimée : remplacez - par un espace
@@ -10,6 +10,8 @@
total = quantity * unit_price
+ # Appliquer la remise si > 100 articles
+ if quantity > 100:
+ total *= 0.9
return total

Règles d’édition :

  • Pour ne pas stager une ligne + : supprimez toute la ligne
  • Pour ne pas stager une ligne - : remplacez le - par un espace (la ligne reste dans le fichier de travail)
  • Ne modifiez jamais les lignes de contexte (sans préfixe)

git add -i donne un menu plus complet que -p :

Fenêtre de terminal
git add -i
staged unstaged path
1: unchanged +3/-1 src/app.py
2: unchanged +1/-0 src/config.py
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>
CommandeÉquivalent
updateStager des fichiers entiers
revertDésélectionner des fichiers stagés
patchIdentique à git add -p
diffVoir le diff stagé
add untrackedStager des fichiers non suivis

En pratique, git add -p suffit dans la grande majorité des cas. Le mode -i est utile quand vous avez beaucoup de fichiers modifiés et voulez un aperçu global.

L’inverse de git add -p. Si vous avez stagé trop de modifications :

Fenêtre de terminal
git reset -p

Le même prompt apparaît, mais cette fois y retire le hunk du staging (le remet dans le working directory).

Fenêtre de terminal
# Équivalent moderne
git restore --staged -p fichier.py

Le mode patch fonctionne aussi avec d’autres commandes :

Fenêtre de terminal
# Annuler des modifications par hunks (working directory)
git checkout -p fichier.py
# Moderne :
git restore -p fichier.py
# Stasher seulement certains hunks
git stash -p
SymptômeCause probableSolution
patch does not applyÉdition manuelle incorrecteRecommencez, respectez les règles d’édition
s ne découpe pasModifications sur lignes adjacentesUtilisez e pour éditer manuellement
Hunk trop grosNombreuses modifications groupéess puis e si nécessaire
Modifications perdues après -pHunk répondu n toujours dans le working dirNormal : n = pas stagé, pas supprimé
  • git add -p stage par hunks — l’outil clé pour des commits atomiques
  • y/n pour accepter/refuser, s pour découper, e pour éditer
  • git reset -p fait l’inverse : retire du staging hunk par hunk
  • Le mode patch fonctionne aussi avec checkout, stash et restore
  • Des commits atomiques facilitent le bisect, le revert et le code review
  • Avant de commiter, vérifiez ce qui est exactement dans l’index : git diff --staged

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn