git commit --amend
Découvrez la commande git commit --amend, ses différentes utilisations et des exemples pratiques pour modifier vos commits.
Ce que fait git commit --amend
Il est facile de terminer un commit et de remarquer immédiatement une faute de frappe dans le message, ou de réaliser qu'on a oublié d'indexer un fichier. La commande git commit --amend est le moyen le plus rapide de corriger ces erreurs : elle permet de modifier le commit le plus récent sur la branche courante.
Au lieu d'empiler un tout petit commit de correction par-dessus, --amend intègre vos modifications indexées (et, optionnellement, un nouveau message) dans le commit précédent. Le résultat est un commit unique et propre, comme si vous l'aviez fait correctement du premier coup.

Il remplace le commit, il ne le modifie pas
C'est la chose la plus importante à comprendre sur --amend. Les commits Git sont immuables, Git ne peut donc pas véritablement modifier un commit existant. À la place, --amend crée un tout nouveau commit à partir de l'arbre courant et du parent de l'ancien commit, puis déplace le pointeur de branche vers celui-ci. Le commit original reste suspendu (sans référence) jusqu'à ce que le ramasse-miettes finisse par le supprimer.
Comme le nouveau commit possède un instantané et/ou un message différent, il obtient également un hash de commit différent. Ce seul fait explique toutes les règles ci-dessous, y compris pourquoi modifier des commits partagés est dangereux.
Modifier le message du dernier commit
Si vous avez effectué un commit avec un message erroné ou peu clair, exécutez git commit --amend pour le réécrire sans toucher à l'instantané. Passez le nouveau message en ligne avec -m pour éviter d'ouvrir l'éditeur :
git commit --amend -m "Fix typo in login validation"Exécutez git commit --amend sans options et Git ouvre votre éditeur pré-rempli avec l'ancien message afin que vous puissiez le modifier de manière interactive. Pratique pour les messages plus longs comportant un corps.
Ajouter des modifications oubliées au dernier commit
Supposons que vous souhaitiez inclure deux fichiers dans un même instantané mais que vous avez oublié d'en indexer un. Indexez le fichier manquant, puis faites un amend :
# You edit project.py and text.py, but only commit project.py
git add project.py
git commit -m "Add data processing helpers"
# You realize text.py belongs in that same commit
git add text.py
git commit --amend --no-editLe drapeau --no-edit conserve le message de commit existant, Git intègre donc silencieusement le text.py nouvellement indexé dans le commit précédent. Sans --no-edit, votre éditeur s'ouvre pour vous permettre de mettre à jour le message en même temps.
Vous pouvez combiner les deux : changer le message et inclure des fichiers oubliés en une seule opération.
git add forgotten-file.js
git commit --amend -m "Add feature with all required files"Vérifier le résultat avec git log
Après un amend, inspectez la branche avec git log pour vérifier que le hash a changé et que l'ancien commit a disparu de l'historique :
git log --oneline -1Un hash court différent à côté de votre message confirme que l'amend a créé un nouveau commit plutôt que de modifier l'ancien en place.
Pièges courants
--amendne touche que le dernier commit. Pour réécrire un commit plus ancien, utilisez plutôt un rebase interactif (git rebase -i).- Tout ce qui n'est pas indexé est exclu. L'amend commite l'index courant, les modifications non indexées restent donc non commitées. Exécutez d'abord
git add. - La date d'auteur est préservée par défaut, mais la date du commiteur est mise à jour. Ajoutez
--reset-authorsi vous souhaitez également actualiser l'identité et la date de l'auteur.
Évitez de modifier des commits déjà poussés
Comme un amend produit un commit avec un nouveau hash, le commit réécrit ne correspond plus à ce que les autres ont récupéré. Ne modifiez jamais un commit qui a déjà été poussé et partagé avec des collègues : leur historique pointe toujours vers l'ancien hash, et un git push normal sera rejeté. Forcer le push (git push --force) peut alors écraser ou dupliquer leur travail.
Le danger est identique à celui d'un reset d'un instantané public : les deux réécrivent un historique dont d'autres dépendent. Réservez --amend aux commits locaux, non poussés, et vous éviterez entièrement le problème.
Ne modifiez que les commits qui n'existent que sur votre machine. Une fois qu'un commit est poussé et récupéré par d'autres, le réécrire avec --amend brisera leur historique.