Trocando usuário e email em commits do Git

Então você resolveu começar aquele projeto que estava engavetado há tempos! Sem pestanejar já resolveu meter a mão no código, criou o projeto, criou um repositório local do git e saiu fazendo seus commits. Após um tempo você foi consultar o log dos commits e percebeu que esqueceu de configurar o usuário e o email que o git usa nos commits. Resultado, o Git usou a opção que era global e nesse caso não era o que você queria. O que fazer?

Sem desespero! Você pode resolver esse problema utilizando a opção filter-branch do Git. Essa opção executa um tipo de operação chamada de reescrita de histórico e logo de cara já digo que isso não é uma boa prática! Você deve fazer isso somente se estiver totalmente certo de que isso é preciso E o seu repositório não for público - com público eu quero dizer estar em algum local na Internet, como Github, por exemplo, e com vários committers - a custo de ser odiado para o resto da sua vida, por todos committers do repositório.

Agora que você já tomou as devidas precauções e tem certeza que quer continuar, execute:

git filter-branch --env-filter "GIT_AUTHOR_NAME='<novo nome>'; GIT_AUTHOR_EMAIL='<novo email>';" HEAD  

Troque <novo nome> e <novo email> pelos nome e email que você quer usar nos commits e pronto, a identidade do autor dos commits será trocada.

Note que se você executar esse comando uma segunda vez o git vai informar o seguinte erro:

Cannot create a new backup.  
A previous backup already exists in refs/original/  
Force overwriting the backup with -f  

Conforme a mensagem informa, a execução desse comando apagará o backup existente. Caso queira executar o comando assim mesmo, use a opção -f ou --force

Além de alterar as informações do autor do commit, você pode também alterar as informações do committer utilizando GIT_COMMITTER_NAME e GIT_COMMITTER_EMAIL da mesma forma como fez no exemplo com GIT_AUTHOR_NAME e GIT_AUTHOR_EMAIL.

A opção filter-branch é muito poderosa e permite fazer diversas outras modificações. Caso queira conhecer mais detalhes consulte o link The Nuclear Option: filter-branch.

E nada de sair por aí estragando os commits alheios :-)