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.

Anshul
fonte

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.

Daniel Cassidy
fonte
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.

Martin G
fonte
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
Adam Dymitruk
fonte
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 
Manish Kumar Singh
fonte
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

Kamil Kiełczewski
fonte