Trilha de aprendizado · Nível 1 · Tutorial 4

Desfazer alterações com segurança

Você será capaz de escolher o comando certo para desfazer uma alteração conforme o estágio em que ela está: arquivo de trabalho, área de preparação ou commit já registrado, sempre conferindo o estado antes e depois e sem perder trabalho por engano.

  • Nível: Iniciante
  • Duração: 19 min
  • 7 passos
Desfazer alterações com segurança

O que você vai percorrer

  1. Identificar o que precisa ser desfeito Identifique onde está a alteração e o que você quer preservar antes de escolher como desfazer. 2 min
  2. Retirar da preparação sem apagar a edição Retire as alterações de notas.txt da área de preparação e confirme que a edição continua no arquivo. 3 min
  3. Descartar uma edição com consciência Descarte uma edição não preparada apenas quando tiver certeza de que pode perdê-la e confira o resultado no arquivo e no Git. 3 min
  4. Corrigir a mensagem do último commit local Corrija apenas a mensagem do último commit não compartilhado e confira que o conteúdo permaneceu igual. 3 min
  5. Desfazer um commit preservando o histórico Reverta uma mudança fictícia pelo identificador do commit e confirme que o efeito foi desfeito sem apagar o registro original. 4 min
  6. Reconhecer atalhos perigosos Reconheça quando um comando pode apagar trabalho ou alterar um histórico que outras pessoas já usam. 2 min
  7. Escolher, executar e conferir com segurança Escolha a ação pela intenção, execute um caso local e reúna evidências de que apenas o esperado mudou. 4 min

O que você vai aprender

  • Identificar, com git status e git log, em qual estágio está a alteração que precisa ser desfeita.
  • Descartar alterações ainda não preparadas de um arquivo com git restore, reconhecendo que o conteúdo descartado não pode ser recuperado pelo Git.
  • Retirar um arquivo da área de preparação com git restore --staged sem alterar o conteúdo do arquivo.
  • Corrigir a mensagem do último commit ainda não compartilhado com git commit --amend.
  • Desfazer o efeito de um commit registrando um novo commit com git revert, preservando o histórico.
  • Reconhecer git reset --hard e a reescrita de histórico como operações destrutivas a evitar neste estágio.

Antes de começar

  • Registrar alterações em commits locais
  • Inspecionar alterações e histórico com diff e log

Passo 1 de 7

Identificar o que precisa ser desfeito

Identifique onde está a alteração e o que você quer preservar antes de escolher como desfazer.

Antes do comando, defina a intenção

Onde está a alteração? O que deve ficar?

“Desfazer” pode significar ações diferentes. Primeiro, identifique o estágio da alteração e o que você quer preservar:

  • Edição não preparada: descartar um conteúdo que você decidiu perder.
  • Alteração preparada: retirar da preparação, mas manter a edição no arquivo.
  • Último commit local: corrigir apenas sua mensagem, mantendo o conteúdo registrado.
  • Commit registrado: desfazer seu efeito, mantendo o registro original no histórico.

A mesma palavra — desfazer — não significa apagar tudo.

Mapa com três estágios: arquivo de trabalho, área de preparação e histórico. No arquivo, a intenção é descartar uma edição; na preparação, retirar sem apagar a edição; no histórico, corrigir a mensagem ou desfazer o efeito de um commit.

Localize a alteração e nomeie a intenção antes de agir.

Associe a situação à intenção

Relacione cada situação ao estágio e à intenção adequada.

Toque em um item e depois no par correspondente.

Prepare um espaço seguro

No seu computador

Crie uma pasta nova e vazia chamada pratica-desfazer, fora dos seus outros repositórios. Use-a exclusivamente nestes exercícios, sem compartilhar o repositório.

No seu editor, crie nessa pasta o arquivo notas.txt, com o conteúdo fictício abaixo, e salve. Depois, abra o terminal nessa pasta.

Conteúdo inicial de notas.txt

text
Notas de estudo
Tema: Git local

Registre o ponto de partida

Execute um comando por vez, somente na pasta nova. Se ocorrer algum erro, pare e confira antes de continuar.

bash
git init
git add notas.txt
git commit -m "Cria notas de estudo"

Inspecione antes de desfazer

Escolha a conferência conforme o caso

Use os comandos que você já conhece: status para localizar alterações, diff para conferir a edição não preparada, diff --staged para conferir o que está preparado e log --oneline para identificar commits.

Agora execute os quatro para conferir o ponto de partida.

bash
git status
git diff
git diff --staged
git log --oneline

Exemplo

Resultado esperado

O status indica que não há alterações pendentes; os dois comandos diff não exibem diferenças; o log mostra um commit com a mensagem “Cria notas de estudo”. O identificador será próprio do seu repositório.

Abra notas.txt e confirme as duas linhas salvas. Esse é o ponto de partida para a próxima prática.

Dica

Se o resultado for diferente

Não execute uma ação para desfazer por tentativa. Confira a pasta atual, o arquivo e o estado do repositório primeiro. Antes de agir, complete: “A alteração está em _ e quero preservar _”.

Passo 2 de 7

Retirar da preparação sem apagar a edição

Retire as alterações de notas.txt da área de preparação e confirme que a edição continua no arquivo.

Desfazer a preparação, não a edição

Você preparou um arquivo por engano, mas quer continuar trabalhando na edição? Use git restore --staged notas.txt.

Esse comando faz a versão de notas.txt na área de preparação voltar à do último commit. O conteúdo do arquivo de trabalho fica intacto, e os commits existentes não mudam.

A edição continua no arquivo

Comparação antes e depois: antes, o arquivo de trabalho e a preparação contêm a edição; depois, só o arquivo de trabalho mantém a edição. A preparação volta à versão do último commit, e o histórico não muda.

Retirar da preparação mantém a edição no arquivo de trabalho.

Prepare uma edição fictícia

No seu computador, use o repositório local de prática criado no passo anterior, que já tem um commit com notas.txt. Execute git status e prossiga apenas se não houver alterações pendentes. Se aparecer algo inesperado, pare e confira antes de editar.

Abra notas.txt no seu editor e acrescente a linha abaixo ao final, sem apagar o conteúdo existente. Salve o arquivo.

Linha para acrescentar em notas.txt

plaintext
Ideia de teste: revisar esta nota depois.

No terminal, dentro dessa pasta, execute os comandos abaixo. A alteração deve aparecer como preparada, e o diff da preparação deve mostrar a linha acrescentada. Vamos simular que essa preparação foi um engano.

Preparar e conferir

bash
git add notas.txt
git status
git diff --staged

Retire e confira o que ficou

Agora retire apenas notas.txt da preparação. Execute a sequência abaixo: o primeiro comando faz a mudança; os demais conferem o resultado.

Retirar da preparação e verificar

bash
git restore --staged notas.txt
git status
git diff --staged
git diff

Resultado esperado

Confira estas evidências:

  • git status: notas.txt aparece modificado, mas não preparado para commit.
  • git diff --staged: não exibe diferenças.
  • git diff: mostra a linha acrescentada.
  • Ao abrir notas.txt no editor, a linha de teste continua lá.

Não faça outro git add nem um commit agora: deixe a edição fora da preparação para a próxima etapa.

Dica

O estado não deve estar limpo

Neste caso, o arquivo continuar modificado é o resultado correto. Você queria retirar a preparação, não perder a edição.

Comprove que a edição foi preservada

Depois de executar a prática, quais evidências mostram que notas.txt saiu da preparação sem perder a edição? Relate o que observou em git status, git diff --staged, git diff e no próprio arquivo. Se algo foi diferente do esperado, descreva a diferença.

Escreva pelo menos 30 caracteres (0/30).

Passo 3 de 7

Descartar uma edição com consciência

Descarte uma edição não preparada apenas quando tiver certeza de que pode perdê-la e confira o resultado no arquivo e no Git.

Restaurar pode apagar a edição

git restore notas.txt substitui o conteúdo do arquivo de trabalho pela versão da área de preparação. Isso pode eliminar edições que você ainda não registrou.

Nesta prática, não há alterações preparadas. Por isso, a versão restaurada coincide com a do último commit.

A diferença essencial: git restore --staged notas.txt preserva a edição no arquivo; git restore notas.txt pode descartá-la.

De onde vem o conteúdo restaurado?

Comparação antes e depois: a área de preparação contém duas linhas. Antes, o arquivo de trabalho contém essas duas linhas e uma linha extra laranja. Depois, ele contém apenas as duas linhas copiadas da preparação. O histórico permanece igual.

O conteúdo vem da preparação para o arquivo de trabalho. O comando não altera os commits.

Atenção

Na dúvida, não descarte

Conteúdo apenas digitado, nunca preparado nem registrado, não pode ser recuperado pelo Git após o descarte. Não conte com recuperação de trabalho não registrado. Se tiver dúvida, pare e salve uma cópia do conteúdo fora da pasta do repositório antes de agir.

Preservar ou descartar?

Para retirar uma alteração da preparação e manter a edição no arquivo, posso usar git restore notas.txt no lugar de git restore --staged notas.txt.

Descarte controlado em notas.txt

1. Edite e confira antes

Use somente o repositório local de exercícios dos steps anteriores. No seu editor, acrescente ao final de notas.txt a linha abaixo, salve e não execute git add:

Rascunho descartável: testar outra ideia.

No terminal, dentro dessa pasta, execute as conferências abaixo. Observe o conteúdo anterior mostrado no diff e o histórico atual.

Inspecionar antes de agir

bash
git status
git diff -- notas.txt
git diff --staged
git log --oneline

2. Decida e só então descarte

Continue somente se notas.txt tiver alterações não preparadas, git diff --staged não mostrar diferenças e não houver outro estado inesperado.

Leia todo o diff: a restauração descartará todas as alterações não preparadas de notas.txt, inclusive a edição que ficou do step anterior, não apenas a linha recém-adicionada. Você aceita perder todas elas? Se não, pare e preserve uma cópia.

Se aceita, execute os comandos abaixo. Depois, reabra notas.txt: as edições descartadas devem desaparecer. O status deve indicar estado limpo, o diff não deve mostrar diferenças e o log deve permanecer igual.

Restaurar apenas o arquivo escolhido e conferir

bash
git restore notas.txt
git status
git diff -- notas.txt
git log --oneline

Comprove o resultado

O que mudou em notas.txt e o que permaneceu igual no histórico? Relate as evidências que você conferiu. Se interrompeu a prática por segurança, explique o que encontrou e o que decidiu preservar.

Escreva pelo menos 30 caracteres (0/30).

Passo 4 de 7

Corrigir a mensagem do último commit local

Corrija apenas a mensagem do último commit não compartilhado e confira que o conteúdo permaneceu igual.

Uma nova mensagem, outro commit

A mensagem do último commit ficou inadequada? Neste exercício, você vai corrigi-la com git commit --amend -m, informando a nova mensagem diretamente no terminal.

O --amend substitui o último commit por outro: não é uma edição de texto no mesmo registro. Ao mudar a mensagem, o identificador também muda.

Comparação antes e depois: o histórico A → B → C passa a ser A → B → C′. C′ substitui C, com mensagem e identificador diferentes, mas com o mesmo conteúdo de arquivos.

Apenas o último commit é substituído. Corrigir somente a mensagem deve manter o conteúdo dos arquivos igual.

Atenção

Condições desta prática

Use apenas o último commit do repositório de exercícios, exclusivamente local e ainda não compartilhado. Exija estado limpo e preparação vazia: alterações preparadas também podem entrar no commit substituto, mesmo que sua intenção seja corrigir só a mensagem.

O que pode entrar por engano?

“Como vou usar -m para corrigir a mensagem, posso deixar outras alterações na área de preparação: elas não entrarão no commit substituto.”

Corrija no seu repositório local

1. Confira antes de agir

No terminal, entre na pasta de exercícios usada nos steps anteriores. Abra notas.txt no seu editor e anote seu conteúdo, sem editar. Execute os comandos abaixo e anote o identificador e a mensagem da primeira linha do log: esse é o último commit.

Inspeção prévia

bash
git status
git diff --staged
git log --oneline

2. Substitua a mensagem e confira

Continue apenas se git status indicar estado limpo, git diff --staged não mostrar nada e o commit nunca tiver sido compartilhado. Se alguma condição falhar, pare sem descartar trabalho para forçar esse resultado.

Use a mensagem abaixo, diferente da atual. Depois dos comandos, releia notas.txt: seu conteúdo deve continuar igual. No log, a primeira linha deve ter a nova mensagem e um novo identificador; a quantidade de commits deve permanecer a mesma.

Correção e inspeção posterior

bash
git commit --amend -m "Documentar a base local de notas"
git status
git diff --staged
git log --oneline

Comprove que só a mensagem mudou

Relate o resultado usando os identificadores reais de antes e depois, a nova mensagem e a comparação do conteúdo de notas.txt. Como ficaram o status e as diferenças preparadas? Se não executou a correção, explique qual condição de segurança não foi atendida.

Escreva pelo menos 30 caracteres (0/30).

Passo 5 de 7

Desfazer um commit preservando o histórico

Reverta uma mudança fictícia pelo identificador do commit e confirme que o efeito foi desfeito sem apagar o registro original.

Desfazer o efeito, manter o registro

Um novo commit faz o caminho inverso

git revert <commit> inverte as alterações do commit escolhido e registra essa inversão em um novo commit. O original continua no histórico.

Diferentemente do amend, que substitui o último commit, o revert acrescenta um registro. Ele não apaga o commit escolhido nem faz todo o projeto voltar indiscriminadamente a um ponto antigo.

O roteiro é: conferir o estado, identificar a mudança registrada, reverter e verificar arquivo e histórico.

Substituir ou acrescentar?

Comparação: amend transforma a sequência A, B em A, B′, substituindo B. Revert transforma A, B em A, B, C, mantendo B e acrescentando C para inverter sua alteração.

No revert, o commit da mudança e o commit que a desfaz ficam no histórico.

Organize o roteiro

Uma mudança fictícia já foi registrada. Ordene as etapas para desfazê-la com segurança.

  1. Conferir o arquivo, o estado e o histórico.
  2. Localizar em git log --oneline o identificador da mudança conhecida.
  3. Executar git revert para esse identificador.
  4. Conferir com git status se não há alterações pendentes.

Registre a mudança que será desfeita

No seu repositório de prática

Use a pasta local exclusiva dos exercícios anteriores. Execute git status e só prossiga se não houver alterações pendentes.

Abra notas.txt no seu editor. Observe o conteúdo atual e, sem substituir nenhuma linha, acrescente ao final a linha fictícia abaixo. Salve o arquivo.

Linha a acrescentar

text
Lembrete fictício: comprar um telescópio.

Confira e registre

Execute uma linha por vez. No diff, confirme que a única mudança é a linha acrescentada; se aparecer algo diferente, pare antes de preparar ou registrar.

bash
git diff -- notas.txt
git add notas.txt
git commit -m "Adiciona lembrete fictício do telescópio"
git status
git log --oneline

Selecione o commit real

O status deve indicar estado limpo. No topo do log, localize a mensagem “Adiciona lembrete fictício do telescópio” e copie o identificador abreviado à esquerda dela. Esse é o commit simples que você acabou de criar e vai reverter.

Reverta e confira

Use o identificador que você encontrou

No comando abaixo, substitua IDENTIFICADOR pelo código real copiado do seu log. Não digite a palavra IDENTIFICADOR literalmente.

A opção --no-edit mantém a mensagem automática do novo commit, sem abrir um editor de mensagens.

Atenção

Se o resultado for inesperado, pare

Execute a reversão somente com estado limpo e com o commit correto identificado. Se aparecer conflito, erro ou um estado inesperado, interrompa a sequência. Não tente resolver com uma operação destrutiva; a resolução de conflitos fica fora desta prática.

Desfaça a mudança registrada

bash
git revert --no-edit IDENTIFICADOR

Comprove o resultado

Se a reversão terminar sem erro, execute os comandos abaixo e reabra notas.txt. A linha do telescópio deve ter desaparecido e o restante deve estar igual ao conteúdo anterior. O status deve estar limpo e o diff, vazio. No log, procure o novo commit de reversão acima do commit original, que continua presente.

bash
git status
git diff -- notas.txt
git log --oneline

O que comprova a reversão?

Relate o que você observou

Depois da prática, descreva o que mudou em notas.txt, o que apareceu no status e quais dois commits você encontrou no topo do log. Se não conseguiu concluir, relate onde parou em vez de presumir o resultado.

Escreva pelo menos 40 caracteres (0/40).

Passo 6 de 7

Reconhecer atalhos perigosos

Reconheça quando um comando pode apagar trabalho ou alterar um histórico que outras pessoas já usam.

Limpo não significa preservado

Atenção

Não execute este atalho

O comando git reset --hard pode eliminar alterações locais em arquivos rastreados, inclusive alterações já preparadas, sem pedir confirmação. Não o use como solução genérica para “deixar tudo limpo” nesta prática.

Um git status limpo informa que não há alterações pendentes; não prova que seu trabalho foi preservado. Depois de desfazer algo, confira também o conteúdo dos arquivos e, quando a ação envolver commits, o histórico. O resultado precisa corresponder à sua intenção, não apenas parecer organizado.

Preservar a edição é a prioridade

Você preparou notas.txt por engano, mas quer manter toda a edição. Alguém sugere git reset --hard para “resolver tudo”. Qual é a decisão adequada?

O histórico pode ser usado por outras pessoas

Substituir um commit que outras pessoas já usam pode deixar vocês com históricos diferentes e dificultar a colaboração. Aqui, amend é uma exceção controlada: corrigir somente a mensagem do último commit ainda não compartilhado, com a preparação vazia.

Para desfazer o efeito de um commit compartilhado, prefira revert: ele mantém os registros existentes e acrescenta o commit inverso.

Comparação de históricos compartilhados. Ao substituir B por B′, seu histórico deixa de conter o mesmo B usado pela outra pessoa. Ao acrescentar C, o commit inverso, A e B continuam no seu histórico.

Preservar os commits existentes mantém uma base comum com quem já usa esse histórico.

Dica

Na dúvida, pare antes de agir

Não sabe se o commit foi compartilhado ou se pode perder uma edição? Interrompa a ação, inspecione o estado e preserve uma cópia do conteúdo importante. Confirme o compartilhamento antes de substituir qualquer commit.

Escolher sem reescrever

O último commit contém uma mudança que precisa ser desfeita. Ele já foi compartilhado e outra pessoa o está usando. Você conferiu o identificador e o estado está limpo. Qual é a opção adequada?

Passo 7 de 7

Escolher, executar e conferir com segurança

Escolha a ação pela intenção, execute um caso local e reúna evidências de que apenas o esperado mudou.

Da intenção à comprovação

Um roteiro para qualquer uma das quatro ações

  1. Defina a intenção: o que deve mudar e o que precisa permanecer intacto?
  2. Inspecione: use git status, os diffs e o log conforme o caso.
  3. Confira a segurança: arquivo certo, conteúdo conhecido e condições atendidas. Na dúvida, pare e preserve o trabalho.
  4. Execute a ação específica.
  5. Comprove o resultado: confira conteúdo, preparação e histórico. Um estado limpo, sozinho, não prova que nada importante foi perdido.
Fluxo de cinco etapas: definir a intenção, inspecionar, verificar a segurança, executar e conferir. A verificação de segurança também permite parar e preservar uma cópia.

Antes de executar, existe uma saída segura: parar e preservar. Depois, confira o que mudou e o que permaneceu intacto.

Quatro intenções, quatro escolhas

Associe situação, comando e preservação

Relacione cada situação à ação adequada. Nas respostas, <id> representa o identificador real do commit conferido no log.

Toque em um item e depois no par correspondente.

Execute: preservar a edição

Confira o ponto de partida

No seu computador, abra o repositório exclusivo desta prática, que já tem commits e o arquivo fictício notas.txt. Execute os comandos abaixo e anote o identificador do último commit. Continue apenas se o estado estiver limpo e o diff preparado não mostrar diferenças. Se algo estiver inesperado, pare sem tentar limpar à força.

Antes de editar

bash
git status
git diff --staged
git log --oneline -3

Prepare uma edição que deve ser mantida

No seu editor, acrescente ao final de notas.txt esta linha e salve:

Lembrete fictício: revisar as notas amanhã.

Execute o próximo bloco por etapas. Após preparar, confira se o diff mostra somente a linha acrescentada. Só então retire da preparação. No final, reabra o arquivo: a linha deve continuar lá, embora não esteja mais preparada.

Prepare, confira, retire e confira novamente

Se a conferência revelar outras mudanças, interrompa a sequência.

bash
# Prepare e inspecione antes de desfazer a preparação
git add notas.txt
git status
git diff --staged

# Continue apenas se aparecer somente a alteração esperada
git restore --staged notas.txt

# Confira o resultado
git status
git diff --staged
git diff
git log --oneline -3

Comprove o que aconteceu

Relate as evidências

Qual comando você usou e por que ele atendia à intenção? Relate o estado antes e depois, o que apareceu nos dois diffs, se a linha permaneceu no arquivo e se o último commit mudou. Não é necessário enviar arquivos.

Escreva pelo menos 60 caracteres (0/60).

Referência para a próxima vez

Resumo

Escolha pelo que deseja preservar

Inspecione → confira as condições → execute → verifique. Evite git reset --hard como atalho.

  • Manter a edição, retirando-a da preparação: git restore --staged notas.txt. O arquivo de trabalho e o histórico permanecem intactos.
  • Descartar a edição: git restore notas.txt. Restaura a versão da preparação; sem alterações preparadas, ela coincide com o último commit. Confira o alvo e só prossiga se aceitar perder a edição.
  • Corrigir somente a mensagem: git commit --amend -m "Mensagem corrigida". Apenas no último commit não compartilhado, com estado limpo e preparação sem diferenças. Confira a nova mensagem, o novo identificador e o conteúdo inalterado.
  • Desfazer o efeito de um commit: git revert --no-edit <id>. Use o identificador real conferido, partindo de estado limpo. Confira o conteúdo e a presença do commit original e do novo commit inverso no log.
  • Na prática final, a linha ficou intencionalmente no arquivo, fora da preparação. Não execute um descarte apenas para deixar o status limpo.

Desfazer alterações com segurança

Parabéns! Você concluiu: Desfazer alterações com segurança

Tutorial concluído! Antes de desfazer, pergunte: onde está a alteração e o que preciso preservar? Depois, use as evidências para confirmar que apenas o esperado mudou.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso