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 a minha é ruim, portanto todas as minhas alterações devem ser abandonadas. Como posso fazer isso?
git
version-control
git-merge
git-merge-conflict
Gwyn Morfey
fonte
fonte
[rejected] gh-pages -> gh-pages (non-fast-forward)
Respostas:
Como você
pull
não teve êxito, entãoHEAD
(nãoHEAD^
) é o último commit "válido" em sua filial:A outra peça que você deseja é deixar que as alterações deles substituam suas alterações.
As versões mais antigas do git permitiam usar a estratégia de mesclagem "deles":
Mas isso já foi removido, como explicado nesta mensagem por Junio Hamano (o mantenedor do Git). Conforme observado no link , você faria o seguinte:
fonte
git fetch origin
->git reset origin (soft reset, your changes are still present)
->git checkout file_to_use_their_version_of another_file (steamroll your own changes back to match the origin)
Eu nunca mais uso o git pull. Como em uma briga entre meu código mais recente e a origem, a origem deve sempre vencer, eu sempregit fetch
egit rebase origin
. Isso realmente torna minhas fusões e conflitos poucos e distantes entre si.git log ..@{upstream}
ougit diff ..@{upstream}
). Depois disso, como você, vou refazer o meu trabalho.git merge -X theirs remote_branch
vez degit pull --strategy=theirs remote_branch
comotheirs
parece uma opção derecursive
git merge --abort
é muito preferível.Se sua versão do git for> = 1.6.1, você poderá 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 poderá usá-lo
git merge --abort
.Como sempre, verifique se não há alterações não confirmadas antes de iniciar uma mesclagem.
Na página do manual git merge
git merge --abort
é equivalente agit reset --merge
quandoMERGE_HEAD
está presente.MERGE_HEAD
está presente quando uma mesclagem está em andamento.Além disso, em relação às 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
elas antes da mesclagem egit stash pop
após concluir a mesclagem ou abortá-la.fonte
<commit>
? #GitMoment: -ogit merge --abort
apenas um sinônimogit reset --merge
? O nome certamente faz mais sentido, mas tem a mesma funcionalidade?http://www.git-scm.com/docs/git-merge
fonte
É tão simples.
O próprio Git mostra a solução quando você está nesse tipo de problema e executa o comando git status.
Espero que isso ajude as pessoas.
fonte
Eu acho que
git reset
você precisa.Cuidado, isso
git revert
significa algo muito diferente de, digamos,svn revert
- no Subversion, a reversão descartará suas alterações (não confirmadas), retornando o arquivo para a versão atual do repositório, enquantogit revert
"desfaz" um commit.git reset
deve fazer o equivalente asvn revert
, ou seja, descartar as alterações indesejadas.fonte
Nesse caso de uso específico, você realmente não deseja interromper a mesclagem, apenas resolva o conflito de uma maneira específica.
Também não há necessidade de redefinir e executar uma mesclagem com uma estratégia diferente. Os conflitos foram destacados corretamente pelo git e o requisito 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, local e remota comuns do arquivo no índice. (É daí que eles são lidos para serem usados em uma ferramenta de diferenças de três vias
git mergetool
.) Você pode uságit show
-los para visualizá-los.A maneira mais simples de resolver o conflito para usar a versão remota literalmente é:
Ou, com git> = 1.6.1:
fonte
git 1.6.1
comando faz muito sentido e é bom. Era exatamente o que eu queria. Eu acho que a solução anterior à 1.6.1 é deselegante e requer conhecimento sobre outras partes do git que devem ser separadas do processo de resolução de mesclagem. Mas a nova versão é ótima!Para um cenário como, eu fiz
git fetch
egit pull
percebi que o ramo upstream não era ramo principal, o que resultou em conflitos indesejados.Isso foi revertido sem redefinir minhas alterações locais.
fonte
Os comentários sugerem que
git reset --merge
é um alias paragit merge --abort
. Vale a pena notar que issogit merge --abort
é apenas equivalente aogit reset --merge
dado que aMERGE_HEAD
está presente. Isso pode ser lido na ajuda do git para o comando mesclar.Após uma mesclagem com falha, quando não há
MERGE_HEAD
, a mesclagem com falha pode ser desfeitagit reset --merge
, mas não necessariamente comgit merge --abort
. Eles não são apenas sintaxe antiga e nova para a mesma coisa .Pessoalmente, acho
git reset --merge
muito mais poderoso para cenários semelhantes ao descrito e falho mesclas em geral.fonte
git stash apply
causou um conflito de mesclagem para mim, masgit merge --abort
não ajudougit reset --merge
.Se você acabar com um conflito de mesclagem e não tiver nada a confirmar, mas ainda assim um erro de mesclagem estiver sendo exibido. Depois de aplicar todos os comandos mencionados abaixo,
Por favor remova
Arquive [recortar e colar para outro local em caso de recuperação] e, em seguida, insira qualquer um dos comandos abaixo, dependendo da versão desejada.
Espero que ajude!!!
fonte
Uma alternativa, que preserva o estado da cópia de trabalho é:
Eu geralmente desaconselho isso, porque é efetivamente como mesclar no Subversion, pois descarta os relacionamentos de ramificação no commit a seguir.
fonte
Desde que o Git 1.6.1.3
git checkout
conseguiu efetuar o checkout de ambos os lados de uma mesclagem:fonte
Eu encontrei o seguinte funcionou para mim (reverter um único arquivo para pré-mesclar o estado):
fonte
Sourcetree
Como você não compromete sua mesclagem, basta clicar duas vezes em outro ramo (o que significa fazer checkout) e, quando o sourcetree perguntar sobre como descartar todas as alterações, concorde :)
fonte