Como desfazer uma mesclagem de git com conflitos


785

Estou no ramo mybranch1. mybranch2é bifurcada mybranch1e foram feitas alterações mybranch2.

Então, enquanto mybranch1eu fiz, git merge --no-commit mybranch2 isso mostra que houve conflitos durante a fusão.

Agora eu quero descartar tudo (o mergecomando) para que mybranch1volte ao que era antes. Não tenho ideia de como faço para fazer isso.


Respostas:


1355

Git mais recente:

git merge --abort

Isso tenta redefinir sua cópia de trabalho para qualquer estado que estivesse antes da mesclagem. Isso significa que ele deve restaurar as alterações não confirmadas antes da mesclagem, embora nem sempre seja possível fazê-lo de maneira confiável. Geralmente, você não deve se mesclar com alterações não confirmadas.

Antes da versão 1.7.4:

git reset --merge

Esta é uma sintaxe mais antiga, mas faz o mesmo que o acima.

Antes da versão 1.6.2:

git reset --hard

que remove todas as alterações não confirmadas, incluindo a mesclagem não confirmada. Às vezes, esse comportamento é útil mesmo em versões mais recentes do Git que suportam os comandos acima.


1
Mas para versões mais antigas do git esta é a maneira de uso
Anshul

7
Às vezes, você ainda precisa usar git reset --mergeas versões mais recentes. Eu tive um git merge --aborterro (sem fazer alterações) onde foi git reset --mergebem-sucedido (e faz a coisa certa) no git 2.2.1.
Theodore Murdock

Eu descobri que precisava fazer isso, git merge --abortseguido de git reset --mergeum conflito automático surgir do meu estoque.
Chef Faraó

1
normalmente git merge --abortfunciona para mim, no entanto, me encontrei em uma situação em que fiz check-out em um estado HEAD desanexado e um dos meus arquivos tinha um estado "ambos modificados". Eu queria descartar tudo e voltar para uma filial, precisava git reset --hard, git merge --abortme disse que não havia fusão para abortar (falta MERGE_HEAD).
yano

Às vezes, git merge --abortnão é possível recuperar seu estado anterior e, nesse caso, a "sintaxe antiga" git reset --hardfaz o truque.
Kevin Stewart

130

Na verdade, vale a pena notar que git merge --aborté apenas equivalente ao git reset --mergeque MERGE_HEADestá presente. Isso pode ser lido na ajuda do git para o comando mesclar.

git merge --abort # is equivalent to git reset --merge when MERGE_HEAD is present.

Após uma mesclagem com falha, quando não há MERGE_HEAD, a mesclagem com falha pode ser desfeita, git reset --mergemas não necessariamente com git merge --abort, portanto , elas não são apenas uma sintaxe antiga e nova para a mesma coisa .

Pessoalmente, acho git reset --mergemuito mais útil no trabalho diário.


2
Obrigado, esta informação foi muito útil. Eu tive uma mesclagem que começou com git stash applyum ramo errado e git merge --abortnão fez nada (não MERGE_HEAD), enquanto git reset --mergefazia o truque.
geomaster 10/09/15

4
Eu já vi cerca de 10 pessoas dizendo que esse git merge --aborté o novo comando git reset --mergee me deparei com o mesmo problema que o @geomaster. Isso foi super útil, obrigado!
Tom

106

Supondo que você esteja usando o git mais recente,

git merge --abort

Ok. Isso não funciona com 1.7.0.7 :( tem que usar --hard redefinido com ele
Anshul

5

Há duas coisas que você pode fazer primeiro desfazer a mesclagem por comando

git merge --abort

ou

você pode ir temporariamente ao seu estado de confirmação anterior por comando

git checkout 0d1d7fc32 

0

Sourcetree

Se você não confirmar sua mesclagem, clique duas vezes em outro ramo (= checkout) e, quando o sourcetree perguntar sobre como descartar todas as alterações, concorde

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.