NOTA: Essa resposta altera os SHA1s, portanto, use-o em uma ramificação que já foi enviada por push. Se você deseja apenas corrigir a ortografia de um nome ou atualizar um email antigo, o git permite fazer isso sem reescrever o histórico usando .mailmap
. Veja minha outra resposta .
Usando o rebase interativo
Você poderia fazer
git rebase -i -p <some HEAD before all of your bad commits>
Em seguida, marque todos os seus commits incorretos como "editar" no arquivo rebase. Se você também deseja alterar seu primeiro commit, você deve adicioná-lo manualmente como primeira linha no arquivo rebase (siga o formato das outras linhas). Então, quando o git solicitar que você altere cada commit, faça
git commit --amend --author "New Author Name <email@address.com>"
edite ou feche o editor que é aberto e faça
git rebase --continue
para continuar a rebase.
Você pode pular a abertura do editor aqui, acrescentando --no-edit
para que o comando seja:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Confirmação única
Como alguns comentadores observaram, se você deseja alterar apenas a confirmação mais recente, o comando rebase não é necessário. Apenas faça
git commit --amend --author "New Author Name <email@address.com>"
Isso mudará o autor para o nome especificado, mas o commit será definido para o usuário configurado em git config user.name
e git config user.email
. Se você deseja definir o committer para algo que você especificar, isso definirá o autor e o committer:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Nota sobre Mesclar confirmações
Houve uma pequena falha na minha resposta original. Se houver algum commit de mesclagem entre o atual HEAD
e o seu <some HEAD before all your bad commits>
, então git rebase
os achatará (e, a propósito, se você usar solicitações pull do GitHub, haverá uma tonelada de commits de mesclagem no seu histórico). Muitas vezes, isso pode levar a um histórico muito diferente (como alterações duplicadas podem ser "rebatizadas") e, na pior das hipóteses, pode git rebase
solicitar que você resolva conflitos difíceis de mesclagem (que provavelmente já foram resolvidos nos commits de mesclagem). A solução é usar o -p
sinalizador para git rebase
, que preservará a estrutura de mesclagem do seu histórico. A página de manual git rebase
alerta que o uso -p
e -i
pode levar a problemas, mas noBUGS
seção que diz "Editar confirmações e reformular suas mensagens de confirmação devem funcionar bem".
Eu adicionei -p
ao comando acima. No caso em que você está apenas alterando a confirmação mais recente, isso não é um problema.