git commit
Enregistrer des modifications dans le dépôt
La commande 'git commit' crée un nouveau commit contenant le contenu actuel de l’index (zone de préparation) et un message décrivant les modifications. Le nouveau commit est un enfant direct de HEAD et devient la nouvelle pointe de la branche courante. Chaque commit est un instantané permanent de l’historique du projet, que l’on peut revoir, comparer ou restaurer à tout moment.
Synopsis
git commit [-a] [-m <msg>] [--amend] [--no-edit] [-v] [-n] [--dry-run] [-s] [-S] [--] [<pathspec>...]Options
Choisir la bonne option
Options de message
Différentes façons de fournir ou de modifier le message de commit
| Commande | Source | Ouvre l’éditeur | Cas d’usage |
|---|---|---|---|
git commit -m "msg" | En ligne | ✗ | Commits rapides avec un message court |
git commit -F file | Fichier | ✗ | Message préparé dans un fichier |
git commit -t file | Modèle | ✓ | Partir d’un modèle dans l’éditeur |
git commit -e | Éditeur | ✓ | Forcer l’éditeur même avec -m |
git commit -C <commit> | Copier | ✗ | Réutiliser le message d’un autre commit |
git commit -c <commit> | Copie + modification | ✓ | Modifier le message d’un autre commit |
Nettoyage du message
Comment le message de commit est traité avant d’être enregistré
| Commande | Mode | Retire les commentaires | Retire les espaces | Idéal pour |
|---|---|---|---|---|
--cleanup=strip | strip | ✓ | ✓ | La plupart des commits |
--cleanup=whitespace | Espaces | ✗ | ✓ | Garder les commentaires # |
--cleanup=verbatim | Tel quel | ✗ | ✗ | Conserver le message à l’identique |
--cleanup=scissors | Ciseaux | Seulement sous la ligne des ciseaux | ✓ | Garder les lignes # en utilisant l’éditeur |
Auteur et date
Changer qui a fait le commit et quand
| Commande | Remplace | Format | Usage typique |
|---|---|---|---|
--author="Name <email>" | Auteur | Nom <email> | Committer au nom de quelqu’un |
--date="date" | Date d’auteur | ISO 8601 / relative | Antidater des commits |
--reset-author | Les deux | Utilisateur/heure actuels | S’approprier un patch appliqué |
Amend et correction de l’historique
Options pour modifier des commits existants
| Commande | Crée | Modifie HEAD | À utiliser avec |
|---|---|---|---|
git commit --amend | Remplacement | ✓ | Corriger le message ou le contenu du dernier commit |
git commit --fixup=<sha> | commit fixup! | ✗ | git rebase -i --autosquash |
git commit --squash=<sha> | commit squash! | ✗ | git rebase -i --autosquash |
Ce qui est committé
Choisir quels fichiers entrent dans le commit
| Commande | Indexe d’abord | Commits | Répertoire de travail |
|---|---|---|---|
git commit | ✗ | Indexé seulement | Inchangé |
git commit -a | Fichiers suivis | Tous les suivis | Inchangé |
git commit -i <file> | Indiqués | Indexé + fichier | Inchangé |
git commit -o <file> | Indiqués seulement | Seulement le fichier | Les autres indexés exclus |
git commit -p | Interactif | Blocs choisis | Inchangé |
Signature GPG
Signer les commits de façon cryptographique pour pouvoir les vérifier
| Commande | Action | Clé utilisée | Quand l’utiliser |
|---|---|---|---|
git commit -S | Signer | Clé GPG par défaut | Prouver l’authenticité des commits |
git commit -S<keyid> | Signer | Clé précise | Utiliser une autre clé de signature |
git commit --no-gpg-sign | Ne pas signer | Aucun | Passer outre commit.gpgSign=true |
Contrôle des hooks
Contourner ou contrôler les hooks pre-commit et post-commit
| Commande | Saute | Niveau de risque | Quand l’utiliser |
|---|---|---|---|
git commit --no-verify | pre-commit + commit-msg | Moyen | Correctif urgent, réparer les hooks plus tard |
git commit --no-post-rewrite | post-rewrite | Faible | Sauter le traitement post-amend lent |
Dry-run et format de sortie
Voir ce qui serait committé sans committer
| Commande | Format | Analysable | Montre |
|---|---|---|---|
--dry-run | Long (par défaut) | ✗ | Statut complet avec indications |
--dry-run --short | Court | ✓ | Codes de statut compacts |
--dry-run --porcelain | Porcelain | ✓ | Format stable pour les scripts |
--dry-run --branch | Avec la branche | ✓ | Ajoute les infos de suivi au format court |
--dry-run -z | Séparés par NUL | ✓ | Sûr pour les noms de fichiers spéciaux |
Statut affiché dans l’éditeur
Contrôler ce qui apparaît dans l’éditeur pendant la rédaction du message
| Commande | Dans l’éditeur | Effet |
|---|---|---|
git commit --status | Statut en commentaires | Voir les fichiers committés (par défaut) |
git commit --no-status | Pas de liste de fichiers | Éditeur plus épuré, moins de distraction |
git commit -v | Diff complet | Relire les modifications exactes en écrivant |
git commit -q | Éditeur normal | Masquer le résumé après le commit |
Commits spéciaux
Créer des commits dans des situations inhabituelles
| Commande | Autorise | Crée un commit | Cas d’usage |
|---|---|---|---|
--allow-empty | Aucune modification | ✓ | Déclencheurs de CI, marqueurs de branche |
--allow-empty-message | Pas de message | ✓ | Scripts automatisés (déconseillé) |
--trailer "Key: value" | Métadonnées | ✓ | Co-authored-by, Fixes, Reviewed-by |
Exemples de workflows
git add .Indexer vos modifications
git commit -m "Fix typo in README"Committer avec un message court
git add -AIndexer toutes les modifications
git commitOuvre l’éditeur pour un message sur plusieurs lignes
(Write: subject line, blank line, detailed body)Suivre la règle 50/72 pour la mise en forme
git add forgotten-file.jsIndexer le fichier oublié
git commit --amend --no-editL’ajouter au dernier commit sans changer le message
git commit --amend -m "Corrected message"Remplacer le dernier commit avec un nouveau message
git commit -a -m "Update config files"Indexer automatiquement les fichiers suivis modifiés/supprimés et committer
git add .Indexer les modifications
git commit -S -m "Verified security patch"Créer un commit signé GPG
Touches de l’éditeur et du mode interactif
Raccourcis clavier quand Git ouvre un éditeur pour votre message de commit, ou en mode interactif.
Vim (par défaut sur beaucoup de systèmes)
core.editor = vimNano
core.editor = nanoVS Code
core.editor = "code --wait"Mode patch (-p)
git commit -pDépannage
no changes added to commit (use "git add" and/or "git commit -a")
Cause : Des fichiers ont changé mais rien n’est indexé - vous avez oublié 'git add'. (Si vous voyez 'nothing to commit, working tree clean', il n’y a aucune modification.)
Indexez les modifications avec 'git add' avant de committer. Utilisez 'git status' pour voir ce qu’il faut indexer.
git add . && git commit -m "message"Please tell me who you are (Author identity unknown)
Cause : Git exige que user.name et user.email soient configurés avant votre premier commit.
Configurez votre identité globalement ou pour ce dépôt.
git config --global user.name "Your Name" && git config --global user.email "you@example.com"Aborting commit due to empty commit message
Cause : Vous avez fermé l’éditeur sans écrire de message, ou le message ne contenait que des commentaires.
Écrivez un message de commit dans l’éditeur, ou utilisez l’option '-m' pour un message en ligne.
git commit -m "Your message here"Le hook pre-commit a échoué
Cause : Un hook pre-commit (lint, tests, formatage) a trouvé des problèmes et a bloqué le commit.
Corrigez les problèmes signalés par le hook. Ne le contournez avec '--no-verify' qu’en cas de nécessité absolue.
git commit --no-verify -m "message"Le hook commit-msg a échoué
Cause : Votre message de commit ne respecte pas le format exigé par les conventions du projet.
Suivez la convention de messages de commit de votre projet (par ex. le format Conventional Commits).
git commit -m "feat: add new feature"Changes not staged for commit
Cause : Vous avez modifié des fichiers mais ne les avez pas ajoutés à la zone de préparation.
Utilisez 'git add' pour indexer des fichiers précis, ou 'git commit -a' pour indexer automatiquement les fichiers suivis.
git add <file> && git commit -m "message"error: failed to push some refs (après un amend)
Cause : Vous avez fait un amend sur un commit déjà poussé, ce qui crée un historique divergent.
Faites un force push (si vous êtes seul sur la branche), ou faites un revert et créez un nouveau commit.
git push --force-with-leaseYour branch is ahead of 'origin/main' by X commits
Cause : Vous avez des commits locaux pas encore poussés.
C’est normal ! Poussez quand vous êtes prêt, ou continuez à travailler en local.
git push origin mainAstuces et pièges
Bonnes pratiques
- ✓Écrivez des messages de commit clairs : commencez par un verbe (Add, Fix, Update, Remove) et gardez le sujet sous 50 caractères.
- ✓Utilisez l’impératif : écrivez 'Add feature' et non 'Added feature' - imaginez compléter « This commit will... »
- ✓Faites des commits atomiques : chaque commit doit représenter une seule modification logique. Ne mélangez pas corrections de bugs et nouvelles fonctionnalités.
- ✓Relisez avant de committer : utilisez 'git diff --staged' pour voir exactement ce que vous allez committer.
- ✓Ne faites jamais d’amend sur des commits poussés : amend réécrit l’historique. Ne modifiez que des commits qui n’ont pas été partagés.
- ✓Séparez le sujet du corps par une ligne vide : pour les messages longs, la première ligne est le sujet, puis une ligne vide, puis les détails.
- ✓Coupez le corps à 72 caractères : c’est lisible dans les terminaux et dans la sortie de git log.
- ✓Référencez les numéros de tickets : ajoutez 'Fixes #123' ou 'Closes #456' pour relier les commits au suivi des tickets.
- ✓Committez souvent, poussez moins souvent : de petits commits fréquents sont plus faciles à relire et à annuler que de gros commits.
- ✓Ne committez pas les fichiers générés : gardez les artefacts de build, les dépendances (node_modules) et les fichiers compilés hors des commits.
Erreurs fréquentes
- ✗Lancer 'git commit' sans avoir indexé les modifications : il faut d’abord 'git add', sauf avec 'git commit -a', qui n’indexe que les fichiers suivis.
- ✗Écrire des messages vagues comme 'fix' ou 'update' : utilisez des messages clairs et descriptifs qui expliquent POURQUOI la modification a été faite.
- ✗Committer trop de modifications sans rapport d’un coup : faites des commits atomiques - une modification logique par commit, pour faciliter relecture et annulation.
- ✗Utiliser --amend sur des commits déjà poussés sur des branches partagées : amend réécrit l’historique et posera des problèmes aux autres.
- ✗Oublier de configurer user.name et user.email : Git exige l’identité de l’auteur avant votre premier commit.
FAQ
'git commit' ne committe que ce qui est dans la zone de préparation. 'git commit -a' indexe automatiquement tous les fichiers suivis modifiés ou supprimés avant de committer - mais PAS les nouveaux fichiers non suivis. Il faut toujours 'git add' pour les nouveaux fichiers.
Pour les commits non poussés : 'git reset --soft HEAD~1' garde les modifications indexées, 'git reset HEAD~1' (identique à --mixed) les désindexe, 'git reset --hard HEAD~1' les jette. Pour les commits poussés : utilisez 'git revert HEAD' pour créer un nouveau commit qui annule les modifications.
Pour le dernier commit : 'git commit --amend -m "New message"'. Pour les plus anciens : utilisez 'git rebase -i' et remplacez 'pick' par 'reword'. Ne le faites jamais pour des commits déjà poussés sur des branches partagées.
Git ouvre votre éditeur configuré pour écrire un message. Si vous le fermez sans enregistrer de message, le commit est abandonné. Utilisez '-m' pour un message en ligne ou '--allow-empty-message' pour committer sans message (déconseillé).
Indexez les fichiers supplémentaires avec 'git add <file>', puis lancez 'git commit --amend --no-edit'. Ils sont ajoutés au commit précédent sans changer son message.
'--amend' remplace entièrement le dernier commit (nouveau hash !). Utilisez-le pour corriger une faute dans un message ou ajouter des fichiers oubliés. Ne l’utilisez jamais sur des commits déjà poussés sur des branches partagées - il réécrit l’historique.
Utilisez plusieurs options -m : 'git commit -m "Subject" -m "Body paragraph"'. Chaque -m crée un nouveau paragraphe. Ou lancez simplement 'git commit' pour ouvrir votre éditeur.
Gardez la ligne de sujet sous 50 caractères (limite stricte 72). Coupez le corps à 72 caractères. C’est lisible dans le terminal, git log et les interfaces GitHub/GitLab.
Utilisez 'git commit --no-verify' ou '-n'. Cela contourne les hooks pre-commit et commit-msg. Avec modération - les hooks existent pour préserver la qualité du code.
Oui, utilisez 'git commit --allow-empty -m "message"'. Pratique pour déclencher des pipelines CI/CD ou marquer des jalons dans l’historique sans modifier le code.