16. Desfazendo commits

Metas

  • Aprender como desfazer commits no repositório local.

01 Desfazendo commits

Algumas vezes você percebe que os novos commits estão errados e você quer desfazê-los. Existem várias maneiras de resolver esse problema, mas nós usamos a mais segura aqui.

Para desfazer o commit, vamos criar um novo commit desfazendo as modificações não desejadas.

02 Edite o arquivo e faça um commit

Substitua o arquivo hello.html com o seguinte.

Arquivo: hello.html

<html>
  <head>
  </head>
  <body>
    <h1>Hello, World!</h1>
    <!-- This is an unwanted but committed change -->
  </body>
</html>

Execute:

git add hello.html
git commit -m "Oops, we didn't want this commit"

03 Faça um commit com as novas modificações que desfazem as modificações anteriores

Para desfazer o commit, precisamos de criar um commit que deleta as modificações feitas pelo commit indesejado.

Execute:

git revert HEAD

Vá para o editor, onde você consegue editar a mensagem padrão do commit ou deixá-la como está. Salve e feche o arquivo.

Você verá …

Resultado:

$ git revert HEAD --no-edit
[master 45fa96b] Revert "Oops, we didn't want this commit"
 1 files changed, 1 insertions(+), 1 deletions(-)

Já que desfizemos o último commit, nós podemos usar HEAD como o argumento para desfazê-lo. Nós podemos cancelar qualquer commit no histórico, apontando seu hash.

Nota: O comando --no-edit pode ser ignorado. Ele era desnecessário para gerar as informações de saída sem abrir o editor.

04 Confira o log

Conferir o log mostra os cancelamentos e commits indesejados no nosso repositório.

Execute:

git hist

Resultado:

$ git hist
* 45fa96b 2011-03-09 | Revert "Oops, we didn't want this commit" (HEAD, master) [Alexander Shvets]
* 846b90c 2011-03-09 | Oops, we didn't want this commit [Alexander Shvets]
* fa3c141 2011-03-09 | Added HTML header (v1) [Alexander Shvets]
* 8c32287 2011-03-09 | Added standard HTML page tags (v1-beta) [Alexander Shvets]
* 43628f7 2011-03-09 | Added h1 tag [Alexander Shvets]
* 911e8c9 2011-03-09 | First Commit [Alexander Shvets]

Essa técnica pode ser aplicada para qualquer commit (mas podem surgir conflitos). É seguro usá-la mesmo em branches públicos de repositórios remotos.

05 Próximo

A seguir vamos olhar a técnica que pode ser usada para remover o último commit do histórico do repositório.