Eu me deparei com um conflito de mesclagem. Como posso abortar a mesclagem?

Eu usei git pull e tive um conflito de mesclagem:

 unmerged: _widget.html.erb You are in the middle of a conflicted merge. 

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

Como sua pull foi malsucedida, HEAD (não HEAD^ ) é o último commit “válido” em seu branch:

 git reset --hard HEAD 

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

Versões mais antigas do git permitiram que você usasse a estratégia de mesclagem “theirs”:

 git pull --strategy=theirs remote_branch 

Mas isso já foi removido, conforme explicado nesta mensagem por Junio ​​Hamano (o mantenedor do Git). Conforme observado no link , você faria isso:

 git fetch origin git reset --hard origin 

Se sua versão git for> = 1.6.1, você pode usar git reset --merge .

Além disso, como o @Michael Johnson menciona, se sua versão do git for> = 1.7.4, você também pode usar o git merge --abort .

Como sempre, verifique se você não tem alterações não confirmadas antes de iniciar uma mesclagem.

Da página de manual do git merge

git merge --abort equivale a git reset --merge quando MERGE_HEAD estiver presente.

MERGE_HEAD está presente quando uma mesclagem está em andamento.

Além disso, em relação a alterações não confirmadas ao iniciar uma mesclagem:

Se você tiver alterações que não deseja confirmar antes de iniciar uma mesclagem, apenas git stash las antes da mesclagem e git stash pop após concluir a mesclagem ou abortá-las.

 git merge --abort 

Anule o processo atual de resolução de conflitos e tente reconstruir o estado de pré-mesclagem.

Se houver alterações não confirmadas no worktree presentes quando a mesclagem for iniciada, o git merge --abort poderá, em alguns casos, não conseguir reconstruir essas alterações. Portanto, é recomendável sempre confirmar ou armazenar suas alterações antes de executar o git merge.

git merge --abort equivale a git reset --merge quando MERGE_HEAD estiver presente.

http://www.git-scm.com/docs/git-merge

Neste caso de uso específico, você não quer realmente abortar a mesclagem, apenas resolver o conflito de uma maneira particular.

Não há necessidade particular de redefinir e executar uma mesclagem com uma estratégia diferente. Os conflitos foram realçados corretamente pelo git e a exigência de aceitar as alterações dos outros lados é apenas para este arquivo.

Para um arquivo não mesclado em um conflito, o git disponibiliza as versões base comum, local e remota do arquivo no índice. (Este é o lugar onde eles são lidos para uso em uma ferramenta de comparação de 3 direções pelo git mergetool .) Você pode usar 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 na íntegra é:

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

Ou, com git> = 1.6.1:

 git checkout --theirs _widget.html.erb 

Eu acho que é o git reset você precisa.

Cuidado que git revert significa algo muito diferente de, digamos, svn revert – no Subversion o revert irá descartar suas mudanças (não confirmadas), retornando o arquivo para a versão atual do repository, enquanto o git revert “desfaz” um commit.

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

Como os comentários sugerem que git reset --merge é um alias para git merge --abort , vale a pena notar que git merge --abort é apenas equivalente a git reset --merge dado que um MERGE_HEAD está presente. Isso pode ser lido na ajuda do git para o comando merge.

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

Após uma falha de mesclagem, quando não há MERGE_HEAD , a mesclagem com falha pode ser desfeita com git reset --merge mas não necessariamente com git merge --abort , então eles não são apenas a syntax antiga e nova para a mesma coisa .

Pessoalmente, acho git reset --merge muito mais poderoso para cenários semelhantes ao descrito, e falhou mescla em geral.

Desde que o Git 1.6.1.3 git checkout foi capaz de fazer checkout em qualquer lado de uma mesclagem:

 git checkout --theirs _widget.html.erb 

Uma alternativa, que preserva o estado da cópia de trabalho é:

 git stash git merge --abort git stash pop 

Eu geralmente aconselho contra isso, porque é efetivamente como mesclar no Subversion, uma vez que joga fora os relacionamentos de ramificação no commit seguinte.

E se você acabar com o conflito de mesclagem e não tiver nada para confirmar, mas ainda assim, o erro de mesclagem será exibido após a aplicação de todos os comandos mencionados abaixo,

 git reset --hard HEAD git pull --strategy=theirs remote_branch git fetch origin git reset --hard origin 

por favor remova

.git \ index.lock

arquivo [corte pasta para algum outro local em caso de recuperação] e, em seguida, digite qualquer um dos comandos abaixo, dependendo da versão que você deseja.

 git reset --hard HEAD git reset --hard origin 

Espero que ajude!!!

Eu encontrei o seguinte trabalhado para mim (reverter um único arquivo para o estado de pré-mesclagem):

 git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*