Alterando mensagens de commits anteriores do Git com os comandos amend e rebase

O versionamento distribuído e o estimulo a criação de branches locais independentes são propriedades que tornam o sistema Git uma das ferramentas mais promissoras para a realização de controle e versionamento de linhas de desenvolvimento. Assim, a partir do uso dessa ferramenta, a criação, o merge e a remoção de linhas de código acabam se tornando uma atividade mais rápida e menos onerosa do que seria com outras ferramentas com características opostas pois lançamos mão de recursos como commits locais. Neste artigo, quero introduzir dois comandos do Git que tornam possível a edição de uma mensagem de commit anterior.

Para começarmos, repetiremos alguns dos passos de criação do repositório criado durante a explicação do guia prático dos comandos básicos do Git para o dia-a-dia do desenvolvedor da seguinte maneira:

mkdir novorepositorio
cd novorepositorio

git init
touch exemplo.txt
git add exemplo.txt
git commit -m "preparacao do repositorio"
git checkout -b novobranch

echo -n "Minha primeira linha de codigo" >> exemplo.txt
git add exemplo.txt
git commit -m "Mensagem 1"

echo -e "nMinha segunda linha de codigo" >> exemplo.txt
git add exemplo.txt
git commit -m "Mensagem 2"

git checkout master
git merge novobranch

Após a execução dos passos anteriores estaremos de posse de um novo repositório e com dois commits realizados com as seguintes mensagens: “Mensagem 1”“Mensagem 2”. Apenas para nos certificamos que tudo ocorreu conforme esperávamos vamos verificar o log de commits com o comando:


git log

E, se tudo deu certo, será impresso na tela algo como a seguinte mensagem indicando os dois commits já realizados.

commit 1a9515e10144238e043711a25e9a804c4cd473b8
Author: Seu nome <seu@email.com>
Date: Tue Aug 7 22:10:16 2012 -0300

Mensagem 2

commit 62f3a3b59f1fbed669f08b265d0a18698b7f015d
Author: Seu nome <seu@email.com>
Date: Tue Aug 7 22:07:30 2012 -0300

Mensagem 1

Sabemos que a descrição de um commit realizado é de extrema importância para o controle de versão de um sistema. Não por outro motivo, ela precisa ser altamente descritiva de forma a nos remeter rapidamente às alterações realizadas em uma determinada entrega. Sendo assim melhoraremos a descrição da última alteração feita mudando a “Mensagem 2” para “Inclusão da segunda linha de código para o exemplo de uso do ammend” usando o comando:

git commit --ammend

Ao executar esse comando somos levados ao editor de texto no qual alteramos a mensagem antiga e gravamos a mensagem alterada. Portanto,  ao concluir os comandos anteriores e executar o commando git log novamente veremos agora a mensagem já alterada para o último commit:

commit 62f86c87e57991d5b815f10d13239d82270361c0
Author: Seu nome <seu@email.com>
Date: Tue Aug 7 22:10:16 2012 -0300

Inclusão da segunda linha de código para o exemplo do uso do comando ammend

commit 62f3a3b59f1fbed669f08b265d0a18698b7f015d
Author: Seu nome <seu@email.com>
Date: Tue Aug 7 22:07:30 2012 -0300

Mensagem 1

Já se quiseremos alterar a descrição da mensagem do commit anterior ou alterar várias mensagens de uma só vez usamos o rebase interativo indicando uma profundidade da seguinte maneira:

git rebase -i HEAD~2

O modificador HEAD~2 usado no comando anterior indica que estamos dispostos a mudar os 2 últimos commits realizados e, portanto, se houver a necessidade de atingir mais do que isso basta mudar o número para um outro que atenda a profundidade desejada. Ao executar esse comando somos levados novamente ao editor de texto que dessa vez, para as mensagens que quisermos alterar, mudaremos onde estiver escrito “pick” para “edit” ou seja, teremos algo como o editor a seguir:

pick 814d75c Mensagem 1
pick 7b1e040 Inclusão da segunda linha de código para o exemplo do uso do comando ammend

# Rebase 114c261..7b1e040 onto 114c261
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

E mudaremos os commits que nos interessam assim:

edit 814d75c Mensagem 1
pick 7b1e040 Inclusão da segunda linha de código para o exemplo do uso do comando ammend

# Rebase 114c261..7b1e040 onto 114c261
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Agora todas as linhas que mudaram para edit serão iterativamente alteradas por você! E basta agora usar o ammend para cada uma delas conforme o console irá sugerir:

Stopped at 814d75c... Mensagem 1
You can amend the commit now, with

git commit --amend

Once you are satisfied with your changes, run

git rebase --continue

Ou seja, basta agora seguir os passos do ammend para os próximos commits e, se tudo der certo, você receberá uma informação como:

[detached HEAD 174412e] Alteração da segunda mensagem
 1 file changed, 1 insertion(+)

Nesse ponto deve-se concluir o processo de rebase usando:

git rebase --continue

E a confirmação do  mensagem de sucesso será:

Successfully rebased and updated refs/heads/master.

Por fim, se realizarmos novamente o comando git log veremos que as descrições foram alteradas conforme o esperado !

 

Artigo relacionados

Guia prático dos comandos básicos do Git para o dia-a-dia do desenvolvedor

GIT: Configurando Meld como ferramenta de Diff externa no Linux

Links sugeridos

http://git-scm.com/book
http://schacon.github.com/history.html

Anúncios