Tive um conflito de fusão. Como posso abortar a fusão?

Eu usei "puxão de merda" e tive um conflito de fusão:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

Eu sei que a outra versão do ficheiro é boa e que a minha é má, por isso todas as minhas alterações devem ser abandonadas. Como posso fazer isso?

Como o seu pull não foi bem sucedido então o HEAD (não o HEAD^) é o último compromisso "válido" na sua filial:

git reset --hard HEAD

A outra peça que você quer é deixar que as mudanças deles substituam as suas mudanças.

Versões mais antigas do git permitiam que você usasse a estratégia de fusão "deles":

git pull --strategy=theirs remote_branch

Mas isto já foi removido, como explicado em esta mensagem de Junio Hamano (o mantenedor do Git). Como observado em o link, ao invés disso você faria isso:

git fetch origin
git reset --hard origin
Comentários (11)

Acho que é "reiniciar" que você precisa.

Cuidado que git revert significa algo muito diferente de, digamos, svn revert - no Subversion a reversão irá descartar suas alterações (não comprometidas), retornando o arquivo para a versão atual do repositório, enquanto git revert "desfaz" um commit.

O git reset deve fazer o equivalente a svn revert, ou seja, descartar suas alterações indesejadas.

Comentários (0)

Neste caso de uso particular, você não quer realmente abortar a fusão, apenas resolver o conflito de uma determinada maneira.

Também não há necessidade particular de reiniciar e realizar uma fusão com uma estratégia diferente. Os conflitos foram corretamente destacados pelo git e a exigência de aceitar as mudanças dos outros lados é apenas para este arquivo.

Para um arquivo não fundido em um git de conflito torna disponível a base comum, versões locais e remotas do arquivo no índice. (É daqui que eles são lidos para uso em uma ferramenta de comparação de 3 vias por git mergetool.) Você pode utilizar o git show para visualizá-los.

# common base:
git show :1:_widget.html.erb

# 'ours'
git show :2:_widget.html.erb

# 'theirs'
git show :3:_widget.html.erb

A maneira mais simples de resolver o conflito para usar a versão remota literalmente é:

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

Ou, com o git >= 1.6.1:

git checkout --theirs _widget.html.erb
Comentários (3)