Editando commits no git

A caverna que você tem medo de entrar guarda o tesouro que você procura. - Joseph Campbell

Victor Perin
, em 4 de julho de 2015

Aew, estamos de volta, pessoal!

Estou escrevendo este post principalmente para mostrar ao pessoal da Princi Web, como editar commits. Se alguma vez você já fez alguma coisa errada no seu repositório, tente aprender com esse tutorial que é possível reverter a situação.

##Criando um contexto Primeiramente, precisamos de commits (obvio não é?). Por isso criei um repositório git de exemplo. Dentro dele, fiz 3 commits que editam 3 arquivos:

  1. Cria um arquivo 1.txt
  2. Cria os arquivos arquivo 2.txt e arquivo 3.txt
  3. Altera os 3 arquivos

Com isso, gerei o seguinte git log: (obs: os commits estão em ordem decrescente)

commit d486558b3b8540b0f06c643fdf6a39e1bb8737e9
Author: Victor Perin <[email protected]>
Date:   Sat Jul 4 02:39:01 2015 -0300

    Alteração dos 3 arquivos

commit 256edaec6dacb645b071b98367e08c223e9dda15
Author: Victor Perin <[email protected]>
Date:   Sat Jul 4 02:37:58 2015 -0300

    commit dos arquivos 2 e 3

commit 76d4599f3d7f4c2ebbc42475de38a8bf00882d87
Author: Victor Perin <[email protected]>
Date:   Sat Jul 4 02:37:28 2015 -0300

    commit do arquivo 1

##Git rebase Ok, agora temos nosso “projeto”. Digamos que na verdade quem fez o segundo commit foi, na verdade, Boris, meu cachorro. (Ta, é tosco, mas serve de exemplo…)

Para começarmos a editar os commits, precisaremos enviar o seguinte comando:

git rebase -i -p d486558b3b8540b0f06c643fdf6a39e1bb8737e9

Você provavelmente está pensando: “Nossa, to perdido”. Mas acalme-se, vou explica-lo…

git rebase - Este comando é responsável por ‘voltar no tempo’ para um commit específico.
-i - modo interativo (vai por mim, vai ser mais fácil…)
-p d486558b3b8540b0f06c643fdf6a39e1bb8737e9 - com isso, você vai voltar para um commit em específico. No meu caso o primeiro commit, pois iremos editar o segundo e o terceiro.

Logo após enviar o comando, o git pedirá para você escolher o que vai fazer:

pick 256edae commit dos arquivos 2 e 3
pick d486558 Alteração dos 3 arquivos

# Rebase 76d4599..d486558 onto 76d4599
#
# 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
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Resumindo o funcionamento:
Cada linha sem # é um commit, troque o comando pelo que você quer fazer com ele.
p ou pick - usar o commit (Vai manter o commit do mesmo jeito, sem alterações)
r ou reword - editar a mensagem deste commit
e ou edit - Edita o commit inteiro (Você fará isso nos proximos comandos…)
s ou squash - Junta o commit da linha com o anterior
f ou fixup - Nunca usei, mas acredito ser útil quando seu repo está corrompido…
x ou exec - Que isso? Porque faria isso?!
Além disso, você pode simplesmente deletar a linha, para apagar o commit. (nunca testei, vou ver se tento um dia…)

Prosseguindo, altere as 2 linhas para:

edit 256edae commit dos arquivos 2 e 3
edit d486558 Alteração dos 3 arquivos

(Salve e feche o arquivo no vim com :wq)

##Git commit –amend Pronto, agora já dissemos ao git que queremos editar nosso commit e ele nos respondeu:

Stopped at 256edaec6dacb645b071b98367e08c223e9dda15... commit dos arquivos 2 e 3
You can amend the commit now, with

	git commit --amend

Once you are satisfied with your changes, run

	git rebase --continue

Perceba que no momento estamos editando o segundo commit. Agora precisamos colocar o nome do meu cachorro lá.

git commit --amend --author "Boris <[email protected]>" --no-edit

Explicando:
git commit - Sim, estamos refazendo o commit
--amend - Com isso dizemos que estamos “melhorando” o commit
--author "Boris <[email protected]>" - Mudamos o nome do autor do commit
--no-edit - Eu não sei exatamente o que faz, me ajudem!

##Git rebase –continue Pronto, já editamos o commit.

Mas agora só precisamos mudar para o proximo commit:

git rebase --continue

Pronto. agora é só editar o próximo commit com o git commit --amend

Repita este processo até acabarem todos os commits que você quis editar e você receberá a mensagem:

Successfully rebased and updated refs/heads/master.

Agora envie o comando git log e corra para o abraço:

commit db769d16e1a061f6b3887050d45fae7d86414be9
Author: Victor Perin <[email protected]>
Date:   Sat Jul 4 02:39:01 2015 -0300

    Alteração dos arquivos 2 e 3 (sim, eu editei...)

commit da7eeb09115fce4faace40d882a233a3b8e244d8
Author: Boris <[email protected]>
Date:   Sat Jul 4 02:37:58 2015 -0300

    commit dos arquivos 2 e 3

commit 76d4599f3d7f4c2ebbc42475de38a8bf00882d87
Author: Victor Perin <[email protected]>
Date:   Sat Jul 4 02:37:28 2015 -0300

    commit do arquivo 1

##Enviando para o server Pra mandar de volta para o seu servidor git, você vai precisar enviar um push forçado:

git push -f origin master #(cuidado com o master!)

Pronto, espero que tenha ajudado e até a próxima!