Trilha de aprendizado · Nível 2 · Tutorial 4

Desfazer um merge com segurança

Interromper um merge em andamento com git merge --abort, voltando ao estado anterior, e desfazer um merge já concluído com git revert, sem apagar o histórico.

  • Nível: Iniciante
  • Duração: 18 min
  • 7 passos
Desfazer um merge com segurança

O que você vai percorrer

  1. Identificar o que precisa ser desfeito Reconheça o estado do merge e decida entre continuar, interromper ou reverter a integração. 2 min
  2. Interromper um merge e conferir o retorno Crie um conflito controlado, interrompa o merge e compare arquivos, branch e último commit com o estado anterior. 4 min
  3. Encontrar o merge e confirmar seus pais Conclua a integração do ensaio e confira qual commit representa o estado anterior da branch de destino. 3 min
  4. Reverter o merge sem apagar o histórico Crie um commit de reversão usando o primeiro pai do merge como referência, preservando o histórico existente. 3 min
  5. Validar o resultado e evitar perda de trabalho Confira arquivos, branch e histórico após a reversão e reconheça o risco de usar reset --hard como atalho. 2 min
  6. Entender o que acontece com a branch integrada Preveja o efeito de uma nova tentativa de merge após interromper ou reverter a integração. 2 min
  7. Aplicar um roteiro seguro para desfazer merges Escolha o procedimento adequado para dois estados de merge e justifique como verificar o resultado sem apagar o histórico. 3 min

O que você vai aprender

  • Reconhecer, com git status, que um merge está em andamento e decidir entre resolver ou interromper.
  • Interromper um merge com conflito usando git merge --abort e confirmar que os arquivos e a branch voltaram ao estado anterior.
  • Identificar um commit de merge já concluído no histórico com git log --oneline --graph.
  • Desfazer um merge concluído e ainda não compartilhado com git revert -m 1, entendendo que o histórico é preservado.
  • Evitar git reset --hard como forma de desfazer um merge, reconhecendo o risco de perda de trabalho.

Antes de começar

  • Integrar branches locais com merge
  • Resolver conflitos simples de merge
  • Desfazer alterações com segurança

Passo 1 de 7

Identificar o que precisa ser desfeito

Reconheça o estado do merge e decida entre continuar, interromper ou reverter a integração.

O merge ainda está em andamento?

Antes de desfazer, consulte git status. Como você já viu, ele indica conflitos pendentes. Mas atenção: resolver os arquivos e prepará-los não conclui o merge; ainda falta registrar o commit.

Exemplo

Duas mensagens que indicam merge pendente

Dependendo do idioma do Git, você pode encontrar:

  • You have unmerged paths. — Há caminhos não mesclados: existem conflitos pendentes.
  • All conflicts fixed but you are still merging. — Todos os conflitos foram resolvidos, mas o merge continua em andamento.

Nos dois casos, a integração ainda não foi concluída.

Dica

Estado limpo não conta toda a história

Um git status limpo não comprova que houve um merge. Para identificar uma integração já registrada, também será preciso consultar o histórico.

Escolha conforme o estado e a intenção

  • Merge em andamento e integração desejada: continue a resolução e conclua o merge.
  • Merge em andamento e integração indesejada: git merge --abort interrompe a operação pendente.
  • Merge já registrado e mudanças indesejadas: git revert cria um novo commit para desfazer mudanças, sem apagar o histórico.

O abort não desfaz um merge já concluído.

Do estado à decisão

Diagrama: um merge em andamento permite continuar ou interromper. Um merge já registrado pode ter suas mudanças desfeitas por uma reversão que acrescenta um commit.

Interromper cancela uma operação pendente; reverter acrescenta um registro ao histórico.

Atenção

Por enquanto, apenas identifique

Não execute os comandos para desfazer ainda. A prática será no seu computador, em uma pasta nova com um repositório local de aprendizado, sem trabalho importante e sem publicação no GitHub.

Qual decisão corresponde a cada situação?

Associe cada situação à decisão apropriada.

Toque em um item e depois no par correspondente.

Passo 2 de 7

Interromper um merge e conferir o retorno

Crie um conflito controlado, interrompa o merge e compare arquivos, branch e último commit com o estado anterior.

Prepare um conflito controlado

Faça este ensaio no seu computador, sem publicar no GitHub e sem usar trabalho importante. No terminal, entre em uma pasta onde você guarda seus projetos, fora de qualquer repositório existente.

Os comandos abaixo funcionam no Git Bash do Windows e em terminais Bash ou Zsh do macOS/Linux. Eles criam um repositório com as branches destino e proposta, que alteram a mesma linha de mensagem.txt. Se a pasta ensaio-merge-seguro já existir, escolha outro nome para os dois primeiros comandos.

Execute na ordem

Se algum comando falhar, pare antes de continuar.

bash
mkdir ensaio-merge-seguro
cd ensaio-merge-seguro
git init -b destino
printf 'Mensagem: inicial\n' > mensagem.txt
git add mensagem.txt
git commit -m "Cria mensagem inicial"
git switch -c proposta
printf 'Mensagem: proposta\n' > mensagem.txt
git add mensagem.txt
git commit -m "Altera mensagem na proposta"
git switch destino
printf 'Mensagem: destino\n' > mensagem.txt
git add mensagem.txt
git commit -m "Altera mensagem no destino"

Registre o ponto de retorno

Antes de integrar, execute os comandos abaixo. Anote a branch atual, o identificador do último commit e o conteúdo do arquivo.

Você deve estar em destino, com o último commit “Altera mensagem no destino” e o arquivo contendo Mensagem: destino. O git status deve indicar estado limpo, sem alterações pendentes.

Confira e anote

bash
git status
git branch --show-current
git log -1 --oneline
cat mensagem.txt

O estado anterior à integração

Um commit inicial se divide em dois caminhos. A ponta de destino, marcada como branch atual, contém Mensagem: destino. A ponta de proposta contém Mensagem: proposta. Ainda não há commit unindo os caminhos.

As duas branches alteraram a mesma linha. Guarde como referência a ponta de destino e o conteúdo dela.

Atenção

Só avance com o estado esperado

Começar com o estado limpo é a condição de segurança deste ensaio, não uma exigência universal de git merge --abort. Se já existiam alterações locais antes do merge, o Git pode não conseguir reconstruir completamente o estado original. Se a conferência não bater, pare antes de iniciar a integração.

Interrompa e compare

Provoque o conflito

Execute este bloco. O conflito em mensagem.txt é esperado: o merge ficará em andamento, sem um commit de conclusão. Confira os caminhos não mesclados no git status.

bash
git merge proposta
git status

Agora cancele a integração

Com o conflito confirmado, execute o próximo bloco, sem resolver nem registrar o merge. Atenção: git merge --abort também abandona as edições feitas para tentar resolver esse merge.

Depois, compare com suas anotações: o estado deve estar limpo e sem merge pendente; a branch deve continuar sendo destino; o identificador do último commit deve ser o mesmo; e o arquivo deve voltar a conter Mensagem: destino, sem marcadores de conflito.

O abort não cria um commit de reversão nem altera os commits existentes: ele cancela a integração ainda não concluída.

Aborte e verifique

Se o abort falhar ou o resultado for diferente do esperado, pare e leia o estado informado pelo Git antes de continuar.

bash
git merge --abort
git status
git branch --show-current
git log -1 --oneline
cat mensagem.txt

Quais evidências confirmam o retorno?

Relate sua conferência

Compare suas anotações com o resultado após git merge --abort. Qual era a branch, qual era o identificador do último commit e qual era o conteúdo do arquivo? O que o git status mostrou depois? Explique como essas observações confirmam que a integração foi cancelada sem criar um novo commit.

Escreva pelo menos 60 caracteres (0/60).

Passo 3 de 7

Encontrar o merge e confirmar seus pais

Conclua a integração do ensaio e confira qual commit representa o estado anterior da branch de destino.

Concluir a integração do ensaio

Continue no repositório local do ensaio anterior. Confira que você está na mesma branch de destino e que o estado está limpo, sem merge pendente. Só então repita a integração.

Nos comandos abaixo, substitua RAMO_INTEGRADO pelo nome da branch que você tentou integrar e ARQUIVO pelo nome do arquivo de texto do ensaio. Não use um projeto com trabalho importante.

Conferir e repetir

Execute uma linha por vez. Se as conferências não corresponderem ao esperado, pare antes do merge.

bash
git status
git branch
git merge RAMO_INTEGRADO

Resolução definida para este ensaio

O mesmo conflito deve reaparecer. No seu editor, substitua todo o conteúdo do arquivo em conflito pela linha abaixo, sem marcadores, e salve.

text
Mensagem: integração concluída.

Preparar e revisar

Confira se a diferença preparada contém exatamente a resolução definida.

bash
git add -- ARQUIVO
git diff --staged

Registrar o merge

Se a revisão estiver correta, conclua. A opção --no-edit aceita a mensagem padrão sem abrir um editor. O status final deve estar limpo.

bash
git commit --no-edit
git status

Localizar o encontro dos históricos

Exiba o histórico. Neste ensaio, o commit apontado por HEAD é o merge que você acabou de concluir. Anote seu identificador.

Localize também o último commit da branch de destino antes da integração: ele deve corresponder à referência que você registrou antes de iniciar o merge.

Ver o merge no grafo

bash
git log --oneline --graph --all --decorate

Um merge, dois antecedentes

Diagrama com dois históricos que chegam ao commit de merge: o estado anterior do destino, em laranja, e a ponta da branch integrada, em azul.

Os dois commits ligados ao merge são seus pais. Para confirmar a ordem deles, consulte os metadados, não apenas o desenho.

Confirmar a ordem nos metadados

Use git show --no-patch --pretty=raw com o identificador do merge. Como ele ainda é o último commit neste ensaio, você pode usar HEAD, como abaixo.

Leia as duas linhas parent na ordem em que aparecem:

  • Primeira: pai 1, o commit em que estava a branch de destino antes do merge.
  • Segunda: pai 2, a ponta da branch que foi integrada.

Compare os identificadores com o grafo e com sua referência anterior. O pai 1 não depende de a branch se chamar main: depende de onde o merge foi executado.

Consultar os pais do merge

Anote o identificador do merge e os dois pais, na ordem exibida. Guarde essas referências para a próxima etapa.

bash
git show --no-patch --pretty=raw HEAD

Atenção

Não deduza a ordem pelo desenho

A posição das linhas no grafo não confirma qual é o pai 1; as linhas parent confirmam. Se a integração foi por fast-forward, ela não criou um commit de merge com dois pais. Não aplique automaticamente git revert -m 1 a esse caso. Se o resultado diferir do ensaio, pare e reavalie.

Qual estado recebeu a integração?

Exemplo para leitura

A integração foi executada na branch entrega. Os identificadores do grafo estão abreviados; abaixo dele aparecem trechos dos metadados do merge.

text
*   c3d4e5f (HEAD -> entrega) Merge branch 'ajuste'
|\
| * b2c3d4e (ajuste) Alterar mensagem na proposta
* | a1b2c3d Alterar mensagem no destino
|/
*   0123456 Versão inicial

commit c3d4e5f678901234567890123456789012345678
parent a1b2c3d456789012345678901234567890123456
parent b2c3d4e567890123456789012345678901234567

Qual alternativa identifica o merge e o pai que representa o estado anterior da branch de destino?

Passo 4 de 7

Reverter o merge sem apagar o histórico

Crie um commit de reversão usando o primeiro pai do merge como referência, preservando o histórico existente.

Desfazer mudanças, não commits

O primeiro pai é a referência

Com o merge concluído, use git revert -m 1 <commit-de-merge> para criar um novo commit que inverte as mudanças introduzidas pelo merge em relação ao primeiro pai.

O -m 1 escolhe o pai 1 como referência principal: no nosso ensaio, o estado da branch de destino antes da integração, que você já identificou. Não significa “desfazer um commit” nem “usar a branch número 1”.

Na prática, acrescentaremos --no-edit para aceitar a mensagem padrão da reversão sem abrir um editor.

O histórico ganha um registro

Dois históricos convergem no merge M. Depois dele, surge o commit de reversão R. P1 é o primeiro pai de M, na linha que recebeu a integração; P2 é o segundo pai. Todos os commits continuam no grafo.

R desfaz a diferença entre P1 e M. Ele não remove M nem os commits da outra linha.

Organizar o procedimento

Antes, durante e depois

Ordene as etapas para reverter o merge do ensaio local.

  1. Observar a confirmação de criação de um novo commit de reversão.
  2. Conferir a branch de destino, o estado limpo, a ausência de merge pendente e o identificador do merge com seus pais já confirmados.
  3. Executar git revert -m 1 --no-edit com o identificador do commit de merge.

Executar no repositório local

Confira antes de agir

No terminal, dentro do repositório de aprendizado, execute as conferências abaixo. A branch marcada com * deve ser a que recebeu o merge; o estado deve estar limpo, sem merge pendente; e o último commit deve ser o merge cujos dois pais você confirmou.

Continue apenas nesse cenário, sem commits posteriores ao merge e sem tê-lo compartilhado. Se algo não corresponder, pare e confira antes de executar a reversão.

Conferir estado, branch e último commit

Compare o identificador exibido pelo log com o merge identificado na etapa anterior.

bash
git status
git branch
git log -1 --oneline

Atenção

Se a reversão gerar conflitos

Não esperamos conflitos neste ensaio, mas um revert pode gerá-los. Se isso acontecer, interrompa a reversão com git revert --abort e pare para reavaliar. Não use git merge --abort: a operação em andamento será uma reversão, não um merge.

Criar o commit de reversão

Substitua <commit-de-merge>, incluindo os sinais < e >, pelo identificador real confirmado. Só então execute. O terminal deve confirmar um novo commit, normalmente com uma mensagem iniciada por “Revert”.

bash
git revert -m 1 --no-edit <commit-de-merge>

Registrar o que aconteceu

Qual foi o resultado?

Relate o que o terminal mostrou ao executar o revert: houve confirmação de um novo commit? Informe o identificador ou a mensagem exibida e explique por que usamos -m 1. Se você precisou interromper a reversão, relate isso em vez de afirmar que ela foi concluída.

Escreva pelo menos 30 caracteres (0/30).

Passo 5 de 7

Validar o resultado e evitar perda de trabalho

Confira arquivos, branch e histórico após a reversão e reconheça o risco de usar reset --hard como atalho.

Conteúdo anterior, histórico preservado

Confira três evidências

No repositório local do ensaio, após o revert:

  1. Abra o arquivo no seu editor e compare seu conteúdo com a referência registrada antes do merge.
  2. Execute os comandos abaixo: confira a branch de destino e a ausência de alterações pendentes no status.
  3. No histórico, localize o novo commit de reversão e o merge, que deve continuar presente.

Neste ensaio, sem commits entre o merge e a reversão, o conteúdo versionado volta ao estado do primeiro pai. O histórico, porém, inclui o merge e sua reversão.

Inspecione sem alterar nada

bash
git status
git log --oneline --graph --all --decorate

Mesmo conteúdo não significa mesmo histórico

Grafo em ordem cronológica: um ancestral se divide em P e Q; ambos chegam ao merge M, seguido da reversão R. Documentos idênticos junto a P e R representam o mesmo conteúdo versionado. Todos os commits permanecem no grafo.

P é o primeiro pai de M. Após R, o conteúdo corresponde a P neste ensaio, mas M continua no histórico.

Registre o que você observou

A reversão passou nas três conferências?

Relate o resultado das três conferências no seu computador: conteúdo do arquivo, branch e status, e presença do merge e da reversão no histórico. Se algo não corresponder ao esperado, descreva a diferença.

Escreva pelo menos 30 caracteres (0/30).

Não troque reversão por descarte

Atenção

Evite git reset --hard como atalho

git reset --hard pode descartar alterações locais em arquivos rastreados. Quando aponta para um commit anterior, também move a branch para trás, em vez de acrescentar uma reversão ao histórico.

Não execute esse comando nesta prática. Ele não é equivalente ao revert, mesmo que o conteúdo final de um arquivo possa parecer igual.

O critério de sucesso

O objetivo não é apenas fazer o arquivo parecer como antes: é desfazer as mudanças da integração mantendo o merge e registrando a reversão em um novo commit.

Confira a diferença

Se o status estiver limpo, usar reset --hard apontando para antes do merge será equivalente a criar um commit de reversão.

Passo 6 de 7

Entender o que acontece com a branch integrada

Preveja o efeito de uma nova tentativa de merge após interromper ou reverter a integração.

A branch continua existindo

Nem abortar nem reverter exclui automaticamente a branch integrada.

  • Após um abort, a integração não foi registrada. A branch continua disponível para ajustes e outra tentativa de merge.
  • Após um revert, os commits continuam no histórico integrado, mas suas mudanças foram desfeitas. Repetir o merge sem novos commits não as reaplica; o Git pode informar que tudo já está atualizado.
  • Com novos commits na branch, é possível integrar novidades, mas isso não restaura automaticamente as mudanças antigas revertidas.
Comparação de históricos: acima, duas linhas divergentes sem commit de merge; abaixo, as linhas se unem em um merge seguido por um commit de reversão. A ponta da branch de origem permanece nos dois casos.

Acima: após abortar, não há merge registrado. Abaixo: após reverter, o merge permanece e ganha um commit de reversão.

Preveja a próxima integração

Relacione cada situação ao resultado esperado.

Toque em um item e depois no par correspondente.

E se for preciso recuperar as mudanças?

O caminho usual é reverter o commit de revert. Isso cria outro commit que desfaz a reversão, sem apagar o histórico.

A forma abaixo é apenas uma referência conceitual; não execute agora. O identificador deve ser o do commit de reversão, não o do merge original.

Reverter a reversão

bash
git revert <commit-de-revert>

Dica

Sem -m

Neste cenário, o commit de revert tem apenas um pai, então não se usa -m. Antes de recuperar as mudanças, revise o resultado desejado e as correções necessárias para não trazer de volta o problema original.

Escolha o alvo correto

Após revisar as mudanças e as correções necessárias, você decide recuperar o conteúdo removido pela reversão do merge. Qual é o caminho usual?

Passo 7 de 7

Aplicar um roteiro seguro para desfazer merges

Escolha o procedimento adequado para dois estados de merge e justifique como verificar o resultado sem apagar o histórico.

Um roteiro antes de agir

O estado define o comando

  1. Inspecione com git status e confira a branch.
  2. Identifique: o merge está em andamento ou já foi registrado?
  3. Confira as condições de segurança e, para reverter, o commit e seus pais.
  4. Execute a ação adequada.
  5. Valide o conteúdo dos arquivos, a branch e o histórico — não apenas o status.

Dois caminhos, verificações em comum

Fluxo de decisão: inspecionar o estado; para merge em andamento, abortar; para merge registrado com dois pais e pai 1 confirmado, reverter. Os dois caminhos terminam na conferência de arquivos, branch e histórico.

Abortar cancela a integração pendente. Reverter acrescenta um commit que desfaz mudanças.

Atenção

Quando parar

Alterações locais não registradas, commit sem dois pais ou resultado diferente do esperado exigem reavaliar antes de seguir. Não aplique git revert -m 1 automaticamente nem use git reset --hard como atalho.

Situação A: integração pendente

Exemplo

Você decidiu não concluir

Em um repositório local de aprendizado, a branch entrega estava limpa, no commit 31bd620. O arquivo aviso.txt continha somente:

Mensagem: versão local

Você executou git merge proposta. Agora, git status indica merge em andamento e conflito em aviso.txt. Não há edições de resolução que você queira guardar. A intenção é cancelar essa integração.

Escolha e comprove

Qual comando você usaria e por quê? Descreva as evidências esperadas no arquivo, na branch e no histórico.

Escreva pelo menos 60 caracteres (0/60).

Situação B: integração registrada

Exemplo

O merge já terminou

Considere outro cenário local, ainda não compartilhado:

  • git status: branch entrega, estado limpo, nenhum merge pendente.
  • O último commit é o merge 7ac91e2, sem commits posteriores.
  • git show --no-patch --pretty=raw 7ac91e2 confirmou, nesta ordem, os pais 31bd620 e 94fe803.
  • O pai 1, 31bd620, era a ponta de entrega antes da integração.
  • Antes, aviso.txt continha “Mensagem: versão local”; após o merge, contém “Mensagem: versão combinada”.

Você quer desfazer as mudanças introduzidas pelo merge, preservando o histórico.

Reverta com uma referência confirmada

Indique o comando completo, explique o papel de -m 1 e diga por que git merge --abort não serve aqui. Como você confirmaria o resultado? Se realizou o ensaio anterior, relacione sua resposta ao que observou.

Escreva pelo menos 80 caracteres (0/80).

Revisão final

Resumo

Desfazer com evidências

Nos dois casos, o procedimento correto mantém os commits já registrados. O que muda é se a integração chegou a ser registrada.

  • Merge pendente: merge --abort cancela a operação; partir de um estado limpo torna o retorno previsível no ensaio.
  • Merge concluído: revert -m 1 cria uma reversão em relação ao primeiro pai confirmado, sem excluir o merge.
  • Confira arquivos, branch e histórico. Status limpo, sozinho, não comprova conteúdo correto.
  • Não use reset --hard como atalho: ele pode descartar trabalho local e mover a branch para trás.
  • A branch integrada continua existindo. Repetir o merge sem novos commits não restaura as mudanças revertidas.

Desfazer um merge com segurança

Parabéns! Você concluiu: Desfazer um merge com segurança

Tutorial concluído! Use o roteiro: inspecionar, escolher, conferir as condições, executar e validar. Se o estado não corresponder ao esperado, pare e reavalie antes de desfazer.

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