REMARQUE: cette réponse modifie les SHA1, alors faites attention à l'utiliser sur une branche qui a déjà été poussée. Si vous souhaitez uniquement corriger l'orthographe d'un nom ou mettre à jour un ancien e-mail, git vous permet de le faire sans réécrire l'historique à l'aide de .mailmap
. Voir mon autre réponse .
Utilisation d'Interactive Rebase
Vous pourriez faire
git rebase -i -p <some HEAD before all of your bad commits>
Ensuite, marquez tous vos mauvais commits comme "modifier" dans le fichier de rebase. Si vous souhaitez également modifier votre premier commit, vous devez l'ajouter manuellement comme première ligne dans le fichier de rebase (suivez le format des autres lignes). Ensuite, quand git vous demande de modifier chaque commit, faites
git commit --amend --author "New Author Name <email@address.com>"
modifier ou simplement fermer l'éditeur qui s'ouvre, puis faites
git rebase --continue
pour continuer le rebase.
Vous pouvez ignorer l'ouverture de l'éditeur ici en ajoutant --no-edit
pour que la commande soit:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Validation unique
Comme certains commentateurs l'ont noté, si vous souhaitez simplement modifier le commit le plus récent, la commande rebase n'est pas nécessaire. Fais juste
git commit --amend --author "New Author Name <email@address.com>"
Cela changera l'auteur en nom spécifié, mais le committer sera défini sur votre utilisateur configuré dans git config user.name
et git config user.email
. Si vous souhaitez définir le committer sur quelque chose que vous spécifiez, cela définira à la fois l'auteur et le committer:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Remarque sur les validations de fusion
Il y avait un léger défaut dans ma réponse d'origine. S'il y a des validations de fusion entre l'actuel HEAD
et le vôtre <some HEAD before all your bad commits>
, git rebase
les aplatiront (et au fait, si vous utilisez des requêtes Pull GitHub, il y aura une tonne de validations de fusion dans votre historique). Cela peut très souvent conduire à un historique très différent (car les modifications en double peuvent être "rebasées"), et dans le pire des cas, cela peut conduire à git rebase
vous demander de résoudre des conflits de fusion difficiles (qui étaient probablement déjà résolus dans les validations de fusion). La solution consiste à utiliser l' -p
indicateur to git rebase
, qui préservera la structure de fusion de votre historique. La page de manuel pour git rebase
avertit que l'utilisation de -p
et -i
peut entraîner des problèmes, maisBUGS
Dans la section, il est indiqué que «la modification des validations et la reformulation de leurs messages de validation devraient fonctionner correctement.
J'ai ajouté -p
à la commande ci-dessus. Dans le cas où vous modifiez simplement la validation la plus récente, ce n'est pas un problème.