git ready

dicas diárias para o noob ao guru
por Nick Quaranto, traduzido pela comunidade RailsBr

corrigindo mensagem quebrada de commit

publicado em 12 Jan 2009

Você quer comitar aquela excelente feature/test/bug, porém alguma coisa não esta certa. Uma ou outra informação não esta preenchida, a mensagem do commit esta errada, ou alguma outra coisa esta confusa. Vamos então ao que pode ser feito para corrigir de fato as informações associadas.

Corrigir o commit anterior é muito simples. Basta usar

git commit --amend

E isto irá disparar o commit no path $EDITOR para você brincar um pouco.
Simplesmente edite com a mensagem certa na linha superior do arquivo, salve, feche e está feito.

Agora vamos conversar sobre como voltar alguns commits para conserta-los, ou o commit que esta quebrado a alguns commits atrás. Este processo é um pouco mais complexo, mas não é tão difícil. (Agradeço ao Evan Phoenix por mais esta.)

Eis o cenário: os 3 últimos commit não tiveram um username correto, email, ou talvez mensagem no commit. Vamos iniciar pela geração do patch dos arquivos para os commits:

git format-patch HEAD^^^

Isto irá gerar arquivos no formato de 0001-commit-message contendo a diferença entre commit e metadados. Uma nota sobre o terceiro símbolo: apenas adicione um para cada commit que você quiser voltar, e seja coerente! EDITADO: Você pode fazer referência a commits passados com a sintaxe HEAD~n, como neste exemplo que usamos HEAD~3. Siga em frente e edite estes arquivos com as informações apropriadas. Feito isso, iremos resetar nosso repositório voltando atrás alguns commits:

git reset --hard HEAD^^^

Agora podemos aplicar a correção das informações de cada commit. Certifique-se de fazer isto na ordem certa! (Usualmente na ascendente)

git am < 0001...
git am < 0002...
git am < 0003...

Agora se você verificar em git log você poderá visualizar as informações corretas. Se por alguma razão as coisas estiverem bagunçadas, faça um

git reset --hard origin/master

que irá trazer de volta as suas alterações originais. Uma vez que você tiver corrigido as informações, você precisará forçar um push no repositório:

git push -f

Se você não adicionar o -f, o git irá reclamar. AVISO! Esteja ciente de que modificar mensagens dos commits pode estragar outros repositórios acima e devem ser usados com precaução. De fato, outros desenvolvedores talvez possam lhe odiar por causa disto. Se estiver longe o bastante para trás provavelmente será uma péssima idéia reescrever o histórico de qualquer maneira.

Se você souber de algum imprevisto ou se descobrir alguma consequência por favor nos informe nos comentários. Outras dicas no futuro irão cobrir a correção dos arquivos atuais commitados e como garantir que todos os repositórios estejam atualizados.