Como abortar um merge no git? Desfazer conflito

Neste artigo você vai aprender a como abortar um merge no git, ou seja, desfazer um conflito de merge que está acontecendo no repositório

Pra abortar um merge no git, rode dentro do repositório:

git merge –abort

Esse comando aborta o processo de resolução de conflito em curso e tenta reconstruir o estado que existia antes do merge

Se o merge JÁ foi commitado, o –abort não serve mais: aí o caminho é git reset –hard ORIG_HEAD (que descarta suas alterações locais) ou, se o merge já foi publicado no remoto, git revert -m 1 <hash-do-merge>

E se o conflito veio de um rebase e não de um merge, o comando certo é git rebase –abort

Como abortar um merge no git capa

Fala programador(a), beleza? Bora aprender mais sobre conflitos, merge e também versionamento com git!

É muito comum quando realizamos ações como git pull ou git merge, acontecer algum conflito

E dependendo da quantidade de código que alteramos ou que recebemos, pode ser um grande desastre xD

Ou mesmo ser um erro nosso realizar merge naquele ponto, isso costuma gerar muita dor de cabeça e também costuma ser inviável ver arquivo por arquivo e solucionar os conflitos

Como então podemos desfazer este merge com conflito? Para voltar ao ponto anterior ao problema

É simples! Basta utilizar o comando:

git merge --abort

Isso vai reconstruir o estado anterior ao merge

Quer aprender mais sobre git? Veja este curso gratuito:

Um outro comando que você pode utilizar, e que faz a mesma coisa, é o:

git reset --merge

O merge –abort é basicamente um alias para este, ou seja, um comando mais novo e com um nome mais objetivo

Então tanto faz a sua escolha, os dois resolvem o nosso problema 🙂

Formação Claude Code
Formação Recomendada

Formação Claude Code

Domine Claude Code do absoluto zero até o avançado

  • 120 aulas
  • 4 projetos
  • 9h 45min

Conclusão

Neste artigo você aprendeu a como abortar um merge no git, ou seja, desfazer um merge conflict

O que é uma ação normal quando realizamos um git merge de outro branch, por exemplo

Utilizamos o comando: git merge –abort ou o git reset –merge

Os dois realizam a mesma função

Confira nossos cursos gratuitos no Youtube, com vídeos todos os dias!

Se inscreva e ative o sininho para receber as notificações e aprender mais ainda sobre desenvolvimento web!

Veja também nosso catálogo de cursos na Udemy, todos com exercícios e projetos práticos, nas mais diversas tecnologias

O link acima contém um cupom de desconto para os cursos!

Antes de rodar o merge, commita ou dá stash:

A própria documentação do git avisa: se existiam alterações não commitadas na sua worktree quando o merge começou (ainda mais se você mexeu nelas DEPOIS do merge iniciar), o git merge –abort pode em alguns casos não conseguir reconstruir essas mudanças

Ou seja, o –abort é ótimo pra desfazer o conflito, mas ele não é rede de segurança pra código solto

Por isso a recomendação oficial é commitar ou dar git stash antes de rodar o git merge

Tome cuidado com isso, é o tipo de coisa que a gente só aprende depois de perder trabalho de uma tarde inteira

E se aparecer ‘fatal: There is no merge to abort (MERGE_HEAD missing)’?

Esse erro significa uma coisa só: não existe merge em andamento pra abortar

O git marca o merge em curso com o MERGE_HEAD, e sem ele o –abort não tem o que desfazer

Na prática isso acontece em dois cenários bem comuns:

1) o merge já foi commitado (o conflito foi resolvido e o commit de merge entrou)

2) o conflito não veio de um merge, e sim de um rebase

Nos dois casos o caminho é outro, e é o que a gente vê logo abaixo

Como desfazer um merge que JÁ foi commitado:

Aqui o –abort não serve mais, o merge deixou de estar ‘em andamento’

Toda operação de merge ou pull guarda a ponta anterior do branch no ORIG_HEAD

Então dá pra voltar resetando pra ele:

git reset –hard ORIG_HEAD

Esse aqui descarta suas alterações locais, ele traz índice e árvore de trabalho de volta àquele estado e move a ponta do branch pro commit anterior

Se você quer preservar alterações locais que NÃO entraram no merge, a própria doc do git reset traz este exemplo:

git reset –merge ORIG_HEAD

E se o merge já foi pro remoto, publicado, visto por todo mundo?

Aí não dá pra reescrever histórico na cara dura

O caminho é o git revert com a opção -m (–mainline), informando qual pai deve ser mantido como linha principal:

git revert -m 1 <hash-do-merge>

Isso cria um NOVO commit que reverte as mudanças, em vez de reescrever o que já está publicado 🙂

E se o conflito veio de um rebase?

Muita gente roda git pull, toma conflito, tenta o merge –abort e leva o erro do MERGE_HEAD

Motivo: existe a configuração pull.rebase, que faz o git pull rebasear por padrão em vez de mesclar

Se o seu ambiente está assim, o que está acontecendo é um rebase, não um merge

O comando pra voltar ao estado anterior é:

git rebase –abort

Ele restaura o branch como estava antes do rebase começar

E as outras duas saídas do rebase, pra você guardar:

git rebase –continue (segue depois de resolver)

git rebase –skip (pula o commit problemático)

git merge –quit: o primo esquecido do –abort

Existe uma terceira saída que quase ninguém cita

O git merge –quit esquece o merge em andamento e deixa o índice e a árvore de trabalho exatamente como estão

Sacou a diferença? O –abort tenta RECONSTRUIR o estado anterior, o –quit só limpa a marcação do merge e te deixa com a bagunça do jeito que ela está

Útil quando você quer manter parte do que já foi mesclado no disco e resolver na mão

Essa opção entrou no Git 2.23, então em qualquer instalação atual (a série recente é a 2.55) ela está lá

Qual comando usar em cada situação:

Merge em andamento, com conflito aberto e você quer voltar atrás: git merge –abort

Merge em andamento e você quer só largar o merge, mantendo índice e árvore como estão: git merge –quit

Merge já commitado, e você aceita descartar alterações locais: git reset –hard ORIG_HEAD

Merge já commitado, mas você quer preservar alterações locais que não entraram nele: git reset –merge ORIG_HEAD

Merge já commitado E publicado no remoto: git revert -m 1 <hash-do-merge>

O conflito é de rebase, não de merge: git rebase –abort

Não há material próprio pertinente disponível: o vídeo fornecido é sobre uma skill do GitHub que faz pesquisa na internet, não tem nenhuma relação com merge, conflito ou rebase no git. Nenhuma frase de experiência foi escrita no texto proposto.

Pra conquistar o espaço de primeira mão nessa SERP (que é o que Stack Overflow, freeCodeCamp e dev.to NÃO entregam), o que precisaria ser gravado/capturado de verdade: (1) terminal real provocando um conflito de merge num repo de teste e rodando git merge –abort, com o antes e depois do git status; (2) o caso do MERGE_AUTOSTASH, mostrando lado a lado o que acontece na worktree com –abort versus com git reset –merge; (3) o cenário do aviso oficial, com alterações não commitadas na worktree antes do merge, pra registrar em que situação o –abort realmente não reconstrói o trabalho; (4) o erro fatal: There is no merge to abort (MERGE_HEAD missing) sendo reproduzido depois de um pull com pull.rebase ligado. Com esses quatro prints/gravações dá pra escrever o bloco de experiência real e o veredito de qual comando usar em cada caso.

Perguntas frequentes

Como abortar um merge no git?

Rodando git merge –abort no repositório

A opção –abort aborta o processo de resolução de conflito em curso e tenta reconstruir o estado anterior ao merge

Ela só funciona com um merge em andamento, ou seja, enquanto o MERGE_HEAD existe

Qual a diferença entre git merge –abort e git reset –merge?

Com o MERGE_HEAD presente, os dois são equivalentes

A exceção está documentada: se também existir um MERGE_AUTOSTASH, o git merge –abort aplica a entrada do stash de volta na sua worktree, enquanto o git reset –merge deixa essas mudanças guardadas na lista de stash

Ou seja, na maioria dos casos dá no mesmo, mas nesse cenário específico o resultado na sua árvore de trabalho é diferente

O que significa o erro ‘fatal: There is no merge to abort (MERGE_HEAD missing)’?

Significa que não existe merge em andamento pra abortar, porque o MERGE_HEAD está ausente

Geralmente é porque o merge já foi commitado, ou porque o conflito na verdade veio de um rebase

No primeiro caso use git reset –hard ORIG_HEAD ou git reset –merge ORIG_HEAD, no segundo use git rebase –abort

O git merge –abort recupera minhas alterações não commitadas?

Nem sempre, e a documentação oficial avisa isso

Se havia alterações não commitadas na worktree quando o merge começou, ainda mais se elas foram modificadas depois do merge iniciar, o git merge –abort pode em alguns casos não conseguir reconstruir essas alterações

Por isso a recomendação é commitar ou dar stash ANTES de rodar o git merge

Como desfazer um merge que já foi commitado?

Operações como pull e merge sempre deixam a ponta original do branch em ORIG_HEAD

Então git reset –hard ORIG_HEAD volta índice e árvore de trabalho àquele estado e move a ponta do branch pra lá, descartando alterações locais

Se você quer preservar alterações locais que não entraram no merge, a doc do git reset traz o exemplo git reset –merge ORIG_HEAD

Como desfazer um merge que já foi enviado pro remoto?

Nesse caso a saída é o git revert com a opção -m (–mainline), informando o número do pai que deve ser mantido como linha principal:

git revert -m 1 <hash-do-merge>

Isso cria um novo commit que reverte as mudanças, em vez de reescrever o histórico que já está publicado

O que faz o git merge –quit?

O –quit esquece o merge em andamento e deixa o índice e a árvore de trabalho como estão

Se existir um MERGE_AUTOSTASH, a entrada é salva na lista de stash

É diferente do –abort, que tenta reconstruir o estado anterior ao merge

Essa opção foi adicionada no Git 2.23

E se o conflito aconteceu durante um rebase?

Aí o comando é git rebase –abort, que restaura o branch como estava antes do rebase

As outras saídas são git rebase –continue e git rebase –skip

Vale lembrar que existe a configuração pull.rebase, que faz o git pull rebasear por padrão em vez de mesclar: por isso às vezes você toma conflito de rebase achando que era merge

Leia também

Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

1 Comentário
Oldest
Newest Most Voted
Marcelo

olá, fui alterar o nome de um commit, depois avancei no projeto e não consigo fazer ou desfazer o merge, nem consigo subir o próximo commit /-: $ git status On branch main Your branch and ‘origin/main’ have diverged, and have 2 and 1 different commits each, respectively.  (use “git pull” to merge the remote branch into yours) No commands done. Next command to do (1 remaining command):   pick 2de06a9 findall categoria padrao DTO  (use “git rebase –edit-todo” to view and edit) You are currently editing a commit while rebasing branch ‘main’ on ‘0f86293’.  (use “git commit –amend” to amend… Read more »

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares