git add & git commit — Staging et sauvegarde des changements
Objectifs de la section
- Maîtriser la zone de staging avec
git add - Créer des commits significatifs avec
git commit - Écrire des messages de commit professionnels
- Utiliser le staging interactif pour des commits précis
La zone de staging en détail
La zone de staging (aussi appelée index) est le superpouvoir unique de Git par rapport aux anciens systèmes de contrôle de version. Elle vous permet de construire votre commit avec une précision chirurgicale.
Pourquoi la zone de staging existe-t-elle ?
Imaginez que vous avez passé la matinée à travailler sur une fonctionnalité. Vous avez modifié 5 fichiers. Mais vous réalisez :
- 3 fichiers appartiennent à une fonctionnalité
- 2 fichiers sont une correction de bug
Sans zone de staging, vous devriez tout commiter ensemble. Avec la zone de staging, vous pouvez créer 2 commits séparés et logiques.
Variantes de git add
Commandes de base
# Ajouter un fichier spécifique
git add README.md
# Ajouter un dossier entier
git add src/
# Ajouter tous les changements dans le répertoire actuel
git add .
# Ajouter tous les fichiers suivis (y compris les fichiers supprimés)
git add -A
# Ajouter uniquement les fichiers modifiés/supprimés (pas les nouveaux)
git add -u
Staging interactif — L'option la plus puissante
# Choisir exactement ce qu'on met en staging, ligne par ligne
git add -p # ou --patch
# Git affiche chaque "hunk" (bloc de code) et demande :
# y = yes (mettre ce hunk en staging)
# n = no (ignorer ce hunk)
# s = split (diviser en hunks plus petits)
# e = edit (éditer manuellement ce qui est mis en staging)
# q = quit
Exemple de session avec git add -p :
diff --git a/main.py b/main.py
index a1b2c3d..e4f5g6h 100644
--- a/main.py
+++ b/main.py
@@ -1,5 +1,8 @@
def saluer(nom):
return f"Bonjour, {nom} !"
+def aurevoir(nom): # ← nouvelle fonction
+ return f"Au revoir, {nom} !"
+
def calculer(a, b):
return a + b
Stage this hunk [y,n,q,a,d,/,e,?]?
git add -p ?Le staging interactif est une meilleure pratique des professionnels. Il crée des commits petits et focalisés qui sont faciles à revoir, annuler ou comprendre dans 6 mois. L'historique des commits devient une vraie documentation.
Variantes de git commit
Commandes de base
# Commiter avec un message en une ligne
git commit -m "feat: ajout de la fonctionnalité de connexion"
# Commiter avec une description détaillée (ouvre l'éditeur)
git commit
# Mettre en staging tous les fichiers suivis ET commiter en une étape
git commit -am "fix: corriger le bug de calcul"
# Modifier le dernier commit (avant de pousser !)
git commit --amend -m "Nouveau message corrigé"
git commit --amend --no-edit # Garder le message, ajouter de nouveaux fichiers en staging
Voir ce que vous allez commiter
# Voir les changements non stagés (répertoire de travail vs zone de staging)
git diff
# Voir les changements stagés (zone de staging vs dernier commit)
git diff --staged # ou : git diff --cached
# Résumé de ce qui sera commité
git status
Écrire des messages de commit professionnels
Un bon message de commit répond à : « Que fait ce commit et POURQUOI ? »
Le format Conventional Commits
<type>(<portée optionnelle>): <description>
[corps optionnel]
[pied de page optionnel]
Types de commits
| Type | Cas d'utilisation | Exemple |
|---|---|---|
feat | Nouvelle fonctionnalité | feat: ajout de l'inscription utilisateur |
fix | Correction de bug | fix: corriger la regex de validation d'email |
docs | Documentation uniquement | docs: mettre à jour la documentation API |
style | Formatage, pas de changement de logique | style: formater le code avec prettier |
refactor | Refactoring, pas de nouvelle fonctionnalité | refactor: extraire la fonction helper d'auth |
test | Ajout ou correction de tests | test: ajouter des tests unitaires pour la connexion |
chore | Maintenance, config, build | chore: mettre à jour les dépendances |
perf | Amélioration des performances | perf: optimiser la requête de base de données |
ci | Configuration CI/CD | ci: ajouter le workflow GitHub Actions |
revert | Annuler un commit | revert: annuler "feat: ajout connexion" |
Bons vs mauvais messages de commit
# ❌ MAUVAIS — que fait ce commit ?
git commit -m "fix"
git commit -m "changements"
git commit -m "WIP"
git commit -m "asdfgh"
# ✅ BON — clair et descriptif
git commit -m "feat(auth): ajouter le mécanisme de rafraîchissement du token JWT"
git commit -m "fix(api): gérer la réponse 404 pour l'utilisateur manquant"
git commit -m "docs: ajouter les instructions de configuration au README"
git commit -m "chore: mettre à niveau les dépendances vers les dernières versions"
Commit multi-lignes avec corps
git commit
# Ouvre votre éditeur. Écrivez :
feat(checkout): ajouter l'intégration de paiement Stripe
Remplacer l'ancienne intégration PayPal par Stripe pour :
- Des frais de transaction moins élevés (2,9% vs 3,5%)
- Un meilleur support des cartes internationales
- Des notifications webhook en temps réel
Closes #142
Reviewed-by: Bob Martin
Comprendre les états des fichiers
Un fichier dans Git peut être dans l'un de ces états :
| État | Description | Commande pour voir |
|---|---|---|
| Non suivi | Nouveau fichier, Git ne le connaît pas | git status |
| Modifié | Fichier suivi avec des changements non sauvegardés | git diff |
| En staging | Prêt à être commité | git diff --staged |
| Commité | Sauvegardé dans le dépôt | git log |
| Ignoré | Exclu via .gitignore | git status --ignored |
Exemples pratiques
Scénario 1 : Fonctionnalité + Correction de bug dans la même session
# Vous avez travaillé sur 2 choses aujourd'hui
git status
# Modified: src/auth/login.py ← nouvelle fonctionnalité
# Modified: src/auth/register.py ← nouvelle fonctionnalité
# Modified: src/utils/email.py ← correction de bug
# Commiter la correction de bug séparément
git add src/utils/email.py
git commit -m "fix(utils): corriger la normalisation d'email pour les majuscules"
# Commiter la nouvelle fonctionnalité
git add src/auth/
git commit -m "feat(auth): ajouter les endpoints de connexion et d'inscription"
Scénario 2 : Staging partiel avec -p
# Vous avez modifié un fichier mais voulez seulement commiter une partie
git add -p src/main.py
# Git montre chaque bloc de changements
# Mettre en staging uniquement les blocs pertinents
# Laisser les blocs non terminés hors staging
Résumé des commandes clés
| Commande | Description |
|---|---|
git add <fichier> | Mettre en staging un fichier spécifique |
git add . | Mettre en staging tous les changements |
git add -p | Staging interactif |
git commit -m "msg" | Commiter avec un message |
git commit -am "msg" | Tout mettre en staging + commiter |
git commit --amend | Modifier le dernier commit |
git diff | Voir les changements non stagés |
git diff --staged | Voir les changements stagés |
git status | Voir l'état actuel |