Acabei de fundir um ramo no meu mestre no git e consegui Automatic merge failed; fix conflicts and then commit the result.
Agora corri git mergetool
e vimdiff foi aberto com a imagem abaixo. Não sei como usar o vimdiff. O que cada painel aqui significa e como devo proceder para corrigir o conflito de mesclagem?
159
Respostas:
Todos os quatro buffers fornecem uma visão diferente do mesmo arquivo. O buffer superior esquerdo (LOCAL) é a aparência do arquivo na ramificação de destino (na qual você está mesclando). O buffer superior direito (REMOTE) é a aparência do arquivo na ramificação de origem (de onde você está mesclando). O buffer do meio (BASE) é o ancestral comum dos dois (para que você possa comparar como as versões esquerda e direita divergem umas das outras).
Eu posso estar enganado no seguinte ponto. Eu acho que a fonte do conflito de mesclagem é que os dois arquivos mudaram a mesma parte do arquivo desde o BASE; LOCAL alterou as aspas de duplo para único e REMOTE fez a mesma alteração, mas também alterou o valor de segundo plano de uma cor para um URL. (Eu acho que a mesclagem não é inteligente o suficiente para perceber que todas as alterações em LOCAL também estão presentes no REMOTE; ele apenas sabe que LOCAL fez alterações desde BASE nos mesmos locais que o REMOTE).
De qualquer forma, o buffer inferior contém o arquivo que você pode editar - aquele localizado no seu diretório de trabalho. Você pode fazer as alterações que desejar;
vim
está mostrando como ela difere de cada uma das vistas superiores, que são as áreas que a mesclagem automática não conseguiu lidar. Puxe as alterações de LOCAL se não desejar as alterações REMOTE. Puxe as alterações de REMOTE, se você preferir as alterações LOCAL. Puxe da BASE se achar que REMOTE e LOCAL estão errados. Faça algo completamente diferente se tiver uma ideia melhor! No final, as alterações feitas aqui são as que realmente serão confirmadas.fonte
:x
ou:w
(:x
sai também) mais 'return'.vim
.A resposta do @ chepner é ótima, eu gostaria de adicionar alguns detalhes sobre a parte "como devo proceder para corrigir o conflito de mesclagem". Se você examinar como realmente usar o vimdiff nesse caso, ele será mostrado abaixo.
Primeiro, para abordar a opção "abortar tudo" - se você não quiser usar "vimdiff" e quiser abortar a mesclagem: pressione Esc, digite
:qa!
e pressione Enter. (consulte também Como faço para sair do editor Vim? ). O Git perguntará se a mesclagem foi concluída, responda comn
.Se você deseja usar o vimdiff, aqui estão alguns atalhos úteis. Isso pressupõe que você conhece os conceitos básicos do Vim (navegação e inserção / modo normal):
:diffget LO
:diffget RE
:diffget BA
:wqa
:cquit
: Como você cancela um diff externo do git?Não parece possível adicionar blocos de conflito locais e remotos sem colar cola ou atalhos personalizados: /vi/10534/is-there-a-way-to-take-both- when-using-vim-as-merge-tool, que é uma pena, pois add add é um tipo de conflito tão comum.
Para impedir que o vimdiff peça para você pressionar enter toda vez que for iniciado, adicione ao seu
.vimrc
:conforme mencionado em: /vi/771/how-can-i-suppress-the-press-enter-prompt-when-opening-files-in-diff-mode
Você pode pesquisar na Internet por outros atalhos do vimdiff. Eu encontrei este útil: https://gist.github.com/hyamamoto/7783966
fonte
:diffget
.A melhor ferramenta de fusão para substituir o vimdiff
Isso é meio que explícito, mas foi para isso que acabei convergindo como um vimmer depois de tentar vimdiff.
Para resolver um conflito de mesclagem, o que quase sempre preciso é ver:
para tentar juntar os dois.
Enquanto o vimdiff mostra BASE, LOCAL e REMOTE na tela:
Eu não sei como fazê-lo mostrar claramente essas duas diferenças que eu preciso, além de olhar direito, esquerdo, direito e esquerdo várias vezes.
Além disso, LOCAL e REMOTE já são visíveis nos marcadores de conflito de mesclagem do git, então não ganho muito com uma ferramenta que os mostra novamente.
Portanto, criei meu próprio "difftool" minúsculo que realmente mostra os diffs que estavam faltando:
~ / bin / cirosantilli-mergetool
GitHub upstream .
E instale-o com:
Agora, quando você faz:
mostra as duas diferenças que eu quero no terminal, por exemplo, algo junto:
Então você pode ver aqui as duas diferenças despejadas no terminal:
RealView_BASE_15560.py
vsRealView_LOCAL_15560.py
RealView_BASE_15560.py
vsRealView_REMOTE_15560.py
Se os diffs forem grandes, procurarei apenas com meus superpoderes do tmux .
Sim, você perde alguns atalhos fornecidos pelo vimdiff, mas, em geral, a solução de conflitos requer uma colagem cuidadosa de cópias de ambas as versões, o que eu posso fazer dentro de uma sessão normal do vim com os marcadores de conflito git.
Observando e diferenciando arquivos enquanto
vimdiff
está em execuçãoAntes de me sentar e automatizar minha configuração perfeita
cirosantilli-mergetool
, era isso que eu estava fazendo para obter as duas diferenças necessárias.Enquanto
git mergetool
estiver em execuçãovimdiff
, se houver um conflito em um arquivo chamado, por exemplomain.py
, o git gera arquivos para cada uma das versões, denominadas como:no mesmo diretório em
main.py
que1367
está o PID do git mergetool e, portanto, um número inteiro "aleatório", como mencionado em: Em um conflito de mesclagem do git, quais são os arquivos BACKUP, BASE, LOCAL e REMOTE que são gerados?Então, para ver as diferenças que eu quero, primeiro encontro os arquivos gerados
git status
e, em seguida, abro novos terminais e faço um vimdiff entre os pares de arquivos que me interessam:Juntamente com
git mergetool
, essas informações ajudam MUITO a descobrir o que está acontecendo rapidamente!Além disso, mesmo enquanto o mergetool estiver em execução, você pode simplesmente abrir o arquivo:
diretamente e edite-o lá se achar que será mais fácil com uma janela maior do editor.
Ir diretamente para mesclar conflitos
Enquanto
]c
pula para o próximo ponto diferencial dentro do vimdiff, nem sempre há um conflito de mesclagem lá.Para ajudar com isso, eu tenho no meu
~/.vimrc
:que encontra os conflitos diretamente.
git imerge
Talvez a melhor opção seja desistir do uso do vimdiff e confiar no vim + git imerge regular, mencionado em: Como descobrir qual commit do Git causa conflitos? já que a curva de aprendizado de vimdiff é irritante e não executa as funções que mais precisamos.
fonte