Encontrei um conflito de fusão. Como posso abortar a fusão?
usei git pull
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 arquivo é boa e que a minha é ruim para que todas as minhas alterações devem ser abandonadas. Como posso fazer isto?
10 answers
Uma vez que o seu pull
não foi bem sucedido então HEAD
(não HEAD^
) é o último commit" válido " no seu ramo:
git reset --hard HEAD
A outra peça que queres é deixar as suas mudanças ultrapassarem as tuas mudanças.
As versões mais antigas do git permitiram-lhe usar a estratégia de junção "deles":
git pull --strategy=theirs remote_branch
Mas isso já foi removido, como explicado em Esta mensagem por Junio Hamano (o mantenedor do Git). Como observado em o link , em vez disso você faria isto:
git fetch origin
git reset --hard origin
Se a sua versão git for > = 1.6. 1, pode utilizar git reset --merge
.
Também, como @Michael Johnson menciona, se a sua versão git for >= 1.7.4, você também pode usar git merge --abort
.
Como sempre, certifique-se de que não tem alterações por persistir antes de iniciar uma junção.
Da página git merge man
git merge --abort
é equivalente a git reset --merge
quando MERGE_HEAD
está presente.
MERGE_HEAD
está presente quando uma fusão está em andamento.
Também em relação às alterações por persistir ao iniciar uma reunir:
Se tiver alterações que não queira enviar Antes de iniciar uma junção, apenas git stash
antes da junção e git stash pop
depois de terminar a junção ou de a interromper.
git merge --abort
Interromper o processo de resolução de conflitos actual, e tentar reconstruir o estado pré-fusão.
Se existirem alterações por persistir na árvore de tarefas quando a junção iniciado,
git merge --abort
em alguns casos será incapaz de reconstruir estas mudanças. Assim, recomenda-se que seja sempre persistir ou esconder as suas alterações antes de executar a junção do git.
git merge --abort
é equivalente agit reset --merge
quandoMERGE_HEAD
é apresentar.
Neste caso específico de uso, você realmente não quer abortar a junção, apenas resolver o conflito de uma forma particular.
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 alterações dos outros lados é apenas para este arquivo.
Para um ficheiro não acumulado num Git de conflito, torna disponível a base comum, as versões locais e remotas do ficheiro no indice. (Aqui é onde eles são lidos para uso em uma ferramenta de 3-way diff por git mergetool
.) Pode usar git show
para os ver.
# common base:
git show :1:_widget.html.erb
# 'ours'
git show :2:_widget.html.erb
# 'theirs'
git show :3:_widget.html.erb
A forma mais simples de resolver o conflito para usar a versão remota é:
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
Cuidado que git revert
significa algo muito diferente de, digamos, svn revert
- no Subversion, o reverter irá descartar as suas alterações( não atribuídas), devolvendo o ficheiro à versão actual do repositório, enquanto que git revert
"anula" um commit.
git reset
deve fazer o equivalente a svn revert
, isto é, rejeitar as suas alterações indesejadas.
Uma vez que os comentários sugerem que git reset --merge
é um nome falso para git merge --abort
, vale a pena notar que git merge --abort
só é equivalente a git reset --merge
Dado que um MERGE_HEAD
está presente. Isto pode ser lido na ajuda do git para o comando de junção.
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
Depois de uma fusão falhada, quando não existe MERGE_HEAD
, a junção falhada pode ser desfeita com git reset --merge
mas não necessariamente com git merge --abort
, Então eles não são apenas uma sintaxe antiga e nova para a mesma coisa.
Desde o início 1.6.1.3 git checkout
foi capaz de obter de ambos os lados de uma junção:
git checkout --theirs _widget.html.erb
Uma alternativa que preserve o estado da cópia de trabalho é:
git stash
git merge --abort
git stash pop
{[[2]} eu geralmente desaconselho isso, porque é efetivamente como mesclar no Subversion à medida que ele joga fora as relações de branch no seguinte commit.
E se você acabar com o conflito da junção e não tiver nada para cometer, mas ainda assim o erro da junção está a ser mostrado depois de aplicar todos os comandos abaixo mencionados,
git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin
Por favor remova
.git\index.bloquear
Ficheiro [cortar colar para outro local em caso de recuperação] e depois introduzir qualquer um dos comandos abaixo, dependendo da versão que deseja.
git reset --hard HEAD
git reset --hard origin
Espero que isso ajude!!!
Encontrei o seguinte a funcionar para mim (reverter um único ficheiro para o estado de pré-junção):
git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*