vimdiff e conflitos de mesclagem

14

Ao mesclar ramificações sob controle de origem, geralmente há o problema de um conflito de mesclagem com outros desenvolvedores.

Eu sei que podemos usar o vimdiff para diferenciar as alterações de código no controle de origem , mas existe também uma maneira de usar o vimdiff para ajudar a resolver conflitos de mesclagem de conflitos.

Pessoalmente, estou mais interessado no git, mas seria útil entender se existem plugins / técnicas para outras ferramentas / sistemas de controle de origem.

Martin York
fonte
Você já experimentou Meld ?
Eric Sabelhaus
1
@EricSabelhaus: É melhor do que vimdiff na resolução de conflitos? Este site é para fazer / responder perguntas sobre o vim.
Martin York
Depende do caso de uso, suponho. Se estiver trabalhando no código que vive remotamente, certamente usarei o vimdiff. Se estiver trabalhando localmente em minha máquina de desenvolvimento, usarei o Meld, pois ele fornece uma interface do usuário rica em recursos para ajudar o desenvolvedor a realizar fusões complexas de três maneiras.
Eric Sabelhaus
1
@ EricSabelhaus: Para mim, o termo feature rich UIé enganoso; O vimdiff pode não ter uma interface agradável, é definitivamente rico em recursos. Também acho o vim um ambiente muito mais produtivo que todos os editores de GUI que usei (mas eu o uso há muito tempo e foi uma curva de aprendizado acentuada). Estou mais curioso se Meld fizer algo que o vim não faça que valha a pena, mesmo olhando.
Martin York
Não posso dizer especificamente se ele tem um conjunto de recursos mais robusto, mas definitivamente está no mesmo domínio que o vimdiff.
Eric Sabelhaus

Respostas:

18

Eu normalmente uso git na linha de comando.

Mas quando há um conflito de mesclagem, eu uso o Vim para resolvê-los (pessoalmente, eu faço isso com o plugin fugitivo). Nota: fugitivo é bom para muita manipulação de git no Vim. Meu recurso favorito é o diferencial de três vias de um conflito de mesclagem.

O git suporta isso no vimdiff via git mergetool. Instalei o fugitivo, mas você pode configurá-lo manualmente (Obrigado @ Jay Thompson).

Configuração manual:

git config --global merge.tool vimdiff
git mergetool <file with conflicts>

A saída é um pouco diferente da descrita abaixo (eu não a usei pessoalmente). Mas o princípio é o mesmo, mas você tem uma quarta janela na parte inferior contendo o resultado.

insira a descrição da imagem aqui

Configurar com Fugitive

vim-fugitive é um plugin para integração / empacotamento do git para o Vim; pode fazer muitas coisas, e resolver conflitos é uma delas.

<Install the Fugitive Plugin>
vim <file with conflicts>
:Gdiff
  1. Vista 2 (esquerda): o código que estava no seu ramo.
  2. Exibição 1 (meio): o código mesclado (com conflitos)
  3. Exibir 3 (à direita): o código que foi mesclado ao seu código.

Agora você pode puxar e obter texto das outras duas visualizações para a visão central (que conterá todas as correções manuais). Depois de resolver todos os conflitos manualmente, basta sair do vimdiff

insira a descrição da imagem aqui

Embora você possa usar :diffget <view number>e :diffput <view number>puxar e empurrar as coisas entre as visualizações. Pessoalmente, não acho isso muito útil. Todo o código já está na exibição do meio. Então, eu apenas gosto de editar essa exibição manualmente até que o conflito seja resolvido. Ser capaz de ver as duas versões do código em ambos os lados da janela do meu editor é extremamente útil.

Também uma demonstração muito boa de seu uso aqui

Martin York
fonte
1
Se você não quiser usar ou instalar o Fugitive por algum motivo, também pode simplesmente definir git config --global merge.tool vimdiffe executar git mergetoolpara iniciar o vim no modo diff.
Jay Thompson
Isso suporta o estilo "diff3" de conflitos de mesclagem, onde os "antepassados ​​comuns mesclados" são mostrados?
Alxndr
@alxndr: Eu nunca tinha ouvido falar do diff3 antes. Mas depois de um rápido google. A saída de um conflito de mesclagem no git (e outro controle de fonte que eu usei) é o mesmo que a diff3 -E. Portanto, as imagens acima são geradas a partir de arquivos que possuem esses marcadores.
Martin York
Agora que olho de perto, a primeira captura de tela mostra o estilo diff3 de mesclagem; o painel superior central "BASE" é o ancestral comum, do qual os painéis esquerdo e direito divergiam.
alxndr
1
É importante lembrar que cada uma dessas 4 visualizações é apenas um buffer. Isso significa que você pode abrir outra guia (ou até ficar na mesma janela) e escolher apenas os buffers que deseja ver a qualquer momento. Não há motivo para manter todas as 4 janelas abertas ao mesmo tempo, se você não estiver usando todas elas.
Cody Poll