NOTA: questa risposta modifica gli SHA1, quindi fai attenzione a usarlo su un ramo che è già stato premuto. Se vuoi solo correggere l'ortografia di un nome o aggiornare una vecchia e-mail, git ti consente di farlo senza riscrivere la cronologia usando .mailmap. Vedi la mia altra risposta .
Utilizzo di Interactive Rebase
Si potrebbe fare
git rebase -i -p <some HEAD before all of your bad commits>
Quindi contrassegna tutti i tuoi commit errati come "modifica" nel file rebase. Se si desidera modificare anche il primo commit, è necessario aggiungerlo manualmente come prima riga nel file rebase (seguire il formato delle altre righe). Quindi, quando git ti chiede di modificare ogni commit, fallo
git commit --amend --author "New Author Name <email@address.com>"
modifica o chiudi semplicemente l'editor che si apre e poi fai
git rebase --continue
per continuare il rebase.
Potresti saltare l'apertura totale dell'editor qui aggiungendo in --no-edit
modo che il comando sarà:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Impegno singolo
Come alcuni commentatori hanno notato, se si desidera solo modificare il commit più recente, il comando rebase non è necessario. Basta fare
git commit --amend --author "New Author Name <email@address.com>"
Ciò cambierà l'autore con il nome specificato, ma il committer verrà impostato come utente configurato in git config user.namee git config user.email. Se vuoi impostare il committer su qualcosa che specifichi, questo imposterà sia l'autore che il committer:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Nota su Unisci commit
C'è stato un piccolo difetto nella mia risposta originale. Se ci sono dei commit di fusione tra la corrente HEADe la tua <some HEAD before all your bad commits>, git rebaseli appiattirai (e comunque, se usi le richieste pull di GitHub, ci saranno un sacco di commit di fusione nella tua cronologia). Questo può portare molto spesso a una storia molto diversa (poiché le modifiche duplicate possono essere "riequilibrate") e, nel peggiore dei casi, può portare a git rebasechiederti di risolvere conflitti di unione difficili (che probabilmente erano già stati risolti nelle commit di unione). La soluzione è utilizzare la -pbandiera a git rebase, che conserverà la struttura di unione della tua cronologia. La manpage per git rebaseavverte che l'utilizzo -pe -ipuò portare a problemi, ma nelBUGS sezione dice "La modifica dei commit e la riformulazione dei loro messaggi di commit dovrebbero funzionare correttamente."
Ho aggiunto -pal comando sopra. Nel caso in cui stai cambiando il commit più recente, questo non è un problema.