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.name
e 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 HEAD
e la tua <some HEAD before all your bad commits>
, git rebase
li 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 rebase
chiederti di risolvere conflitti di unione difficili (che probabilmente erano già stati risolti nelle commit di unione). La soluzione è utilizzare la -p
bandiera a git rebase
, che conserverà la struttura di unione della tua cronologia. La manpage per git rebase
avverte che l'utilizzo -p
e -i
può portare a problemi, ma nelBUGS
sezione dice "La modifica dei commit e la riformulazione dei loro messaggi di commit dovrebbero funzionare correttamente."
Ho aggiunto -p
al comando sopra. Nel caso in cui stai cambiando il commit più recente, questo non è un problema.