Chapters ā–¾ 2nd Edition

2.4 NoƧƵes BƔsicas do Git - Desfazer Coisas

Desfazer Coisas

A qualquer momento tu podes querer desfazer algo. Aqui vamos analisar algumas ferramentas bÔsicas usadas para desfazer as alterações que tu fizeste. Te, cuidado, às vezes não é possível recuperar algo depois de o ter desfeito. Esta é uma das poucas Ôreas em que a Git pode perder parte do seu trabalho se cometer um erro.

Um dos itens comuns ocorre quando cometes muito cedo e, possivelmente esqueçes de adicionar alguns arquivos ou confundes a tua mensagem de confirmação. Se quiseres refazer esta confirmação, faz as alterações adicionais que te esqueceste, coloca-as e confirma novamente usando a opção --amend:

$ git commit --amend

Este comando usa a tua Ôrea de preparação para confirmação. Se não fizeste alterações desde a tua última confirmação (por exemplo, executas este comando logo após a confirmação anterior), o instantâneo ficarÔ exatamente o mesmo, e a única coisa que tu mudarÔs é a mensagem de confirmação.

O mesmo editor de confirmação serÔ iniciado, mas tu verÔs que jÔ inclui a mensagem da tua confirmação anterior. Podes editar a mensagem como de costume e a tua confirmação anterior serÔ substituída.

Por exemplo, se confirmares e depois perceberes que te esqueceste de preparar as alterações num arquivo que tu querias incluir nesta confirmação, tu podes fazer o seguinte:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

No final, acabarĆ”s com apenas uma confirmação — a segunda confirmação substitui o resultado da primeira.

Ɖ importante entender que, quando estĆ”s a modificar a tua Ćŗltima confirmação, nĆ£o estĆ”s tanto a arranjar-la como a substituir inteiramente com uma nova confirmação melhorada que empurra a antiga confirmação fora do caminho e coloca a nova confirmação no seu lugar. Efectivamente, Ć© como se a confirmação anterior nunca acontecesse, e nĆ£o aparecerĆ” no teu histórico do repositório.

O valor óbvio para comprometer confirmaƧƵes Ć© fazer melhorias menores para a tua Ćŗltima confirmação, sem aglomerar o histórico do repositório com as mensagens de confirmação do formulĆ”rio, ā€œOops, esqueci de adicionar um arquivoā€ ou ā€œDarn, a corrigir um erro de digitação na Ćŗltima confirmaçãoā€.

Desfazer um Arquivo Preparado

As próximas duas seções demonstram como lidar com as mudanças na tua Ôrea de preparação e seu diretório de trabalho. Felizmente, o comando que tu usas para determinar o estado destas duas Ôreas também lembra como desfazer as mudanças neles. Por exemplo, supõe que tenhas mudado dois arquivos e que as confirmações como duas mudanças separadas, mas acidentalmente digitaste git add * e preparaste os dois. Como podes obter um deles fora da Ôrea de preparação? O comando git status lembra-te como:

$ git add *
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README
    modified:   CONTRIBUTING.md

Logo abaixo do texto ā€œChanges to be committedā€, podes ver que diz que usas git reset HEAD <file>... para desfazer a preparação. Portanto, vamos usar os conselhos para desfazer a preparação do arquivo CONTRIBUTING.md:

$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M	CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

O comando é um pouco estranho, mas funciona. O arquivo CONTRIBUTING.md é modificado e, novamente, não estÔ pronto.

Embora o git reset seja um comando perigoso se tu o chamares com --hard. No entanto, no cenÔrio descrito acima, o arquivo no teu diretório de trabalho não é tocado, por isso é relativamente seguro.

Por enquanto, a única coisa que precisas de saber sobre o comando git reset é esta invocação mÔgica. Entraremos em mais detalhes sobre o que é reiniciar e como dominÔ-lo para que ele faça coisas realmente interessantes em <ch07-git-tools#_git_reset>>..

Desfazer um arquivo modificado

E se tu perceberes que nĆ£o desejas manter as tuas alteraƧƵes no arquivo CONTRIBUTING.md? Como podes facilmente restaura-lo — reverte-o de volta ao que ele parecia quando quando o tu o confirmaste pela Ćŗltima vez (ou inicialmente clonado, ou no entanto entraste no teu diretório de trabalho)? Por sorte, git status diz-te como fazer isto tambĆ©m. No Ćŗltimo exemplo de saĆ­da, a Ć”rea nĆ£o identificada parece com isto:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

Ele diz muito explicitamente como descartar as mudanƧas que tu fizeste. Vamos fazer o que ele diz:

$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Agora podes verificar que as mudanƧas foram revertidas.

Ɖ importante entender que git checkout -- <file> Ć© um comando perigoso. Todas as mudanƧas que izeste neste arquivo desapareceram — o Git apenas copiou outro arquivo sobre ele. Nunca uses este comando a menos que saibas absolutamente que nĆ£o desejas o arquivo.

Se tu quiseres manter as mudanças que fizeste neste arquivo, mas ainda precisas sair do caminho por agora, iremos falar de como ocultar e ramificar em Ramificação do Git; estas são, geralmente as melhores maneiras de ir.

Lembra-te, qualquer coisa que seja committed no Git quase sempre pode ser recuperada. Mesmo os compromissos que estavam em ramos que foram excluídos ou os compromissos que foram substituídos por um compromisso --amend podem ser recuperados (consulta Data Recovery para recuperação de dados). No entanto, qualquer coisa que tu perderes que nunca foi cometido provavelmente nunca mais serÔ vista novamente.

scroll-to-top