Skip to content

Latest commit

 

History

History
112 lines (76 loc) · 4.68 KB

README.md

File metadata and controls

112 lines (76 loc) · 4.68 KB

Exemplo prático de solução de conflitos de merge

  1. Clone o projeto na branch específica
git clone --branch answers1 [email protected]:nenitf/exemplo_vim-merge-conflict.git
cd exemplo_vim-merge-conflict
  1. Force o conflito
git pull origin answers2 --no-rebase

Resolvendo no vim

Fugitive (diretamente no vim)

  1. Veja o status com :G

  2. Acesse o arquivo com 3-way-split usando dv com o cursor no mesmo

O terminal renderizará com 3 janelas, sendo: 1) O arquivo LOCAL antes do conflito; 2) O arquivo que está sendo mergeado para o commit; 3) O arquivo vindo do REMOTE.

Alterne entre as janelas com CTRLWH e CTRLWL e chunks com [c ]c

  1. Resolva e salve o arquivo do meio, possibilidades:

    • Utilize dp no LOCAL ou REMOTE para atualizar a janela do meio
    • Utilize :diffg //2 para pegar atualizações do LOCAL ou :diffg //3 do REMOTE para atualizar a janela do meio
    • Utilize d2o para pegar atualizações do LOCAL ou d3o do REMOTE para atualizar a janela do meio
  2. Salve o buffer que está sendo mergeado e torneo staged dentro de :G

Resolvendo com mergetool

Caso não tenha finalizado mas queira sair do merge, utilize :cq ao invés de :qa para avisar ao git que o merge não foi finalizado. Caso tenha saido sem querer com :qa e não consiga voltar a usar git mergetool, retome o status de "não resolvido" do arquivo com git update-index --unresolve arquivo_existente.txt ou cancele tudo com git merge --abort

Com vimdiff/nvimdiff

  1. Configure o git mergetool corretamente no ~/.gitconfig
[mergetool]
    keepBackup = false
[merge]
    tool = vimdiff
    #conflictstyle = diff3
  1. Execute o vimdiff com git mergetool

O terminal renderizará com 4 janelas, sendo as 3 de cima representando em ordem: 1) O arquivo LOCAL antes do conflito; 2) O arquivo BASE (comum) do local e ao remoto; 3) O arquivo vindo do REMOTE. Em baixo como o arquivo está sendo mergeado para o commit

Alterne entre as janelas com CTRLWW e chunks com [c ]c

  1. Utilize a cada demarcação :diffg TIPO_DE_ARQUIVO_COM_A_OPÇÃO_CORRETA. Sendo: :diffg LO para optar pelo local e :diffg RE para o remoto

  2. Salve o buffer que está sendo mergeado com :wqa

Com vimdiff adaptado

  1. Configure o git mergetool corretamente no ~/.gitconfig
[mergetool]
    keepBackup = false
[merge]
    tool = merge3
[mergetool "merge3"]
    cmd = vim -d -c \"wincmd l\" \"$LOCAL\" \"$MERGED\" \"$REMOTE\"
  1. Execute o vimdiff com git mergetool

O terminal renderizará com 3 janelas, sendo: 1) O arquivo LOCAL antes do conflito; 2) O arquivo que está sendo mergeado para o commit; 3) O arquivo vindo do REMOTE.

Alterne entre as janelas com CTRLWH e CTRLWL e chunks com [c ]c

  1. Utilize a cada demarcação :diffg TIPO_DE_ARQUIVO_COM_A_OPÇÃO_CORRETA. Sendo: :diffg LO para optar pelo local e :diffg RE para o remoto

  2. Salve o buffer que está sendo mergeado com :wqa

Com vimdiff adaptado usando plugin diffconflicts (meu favorito)

  1. Configure o git mergetool corretamente no ~/.gitconfig
[merge]
    tool = diffconflicts
[mergetool "diffconflicts"]
    cmd = nvim -c DiffConflicts \"$MERGED\" \"$BASE\" \"$LOCAL\" \"$REMOTE\"
    trustExitCode = true
    keepBackup = false
  1. Execute com git mergetool

O terminal renderizará 2 janelas, sendo: 1) O arquivo que deve ser alterado ja modificado com as alterações antes do conflito (ours); 2) O arquivo (somente visualização) com as alterações que causaram o conflito (theirs)

Navegue entre chunks de diff com [c ]c

  1. Atualize a primeira janela com o estado pretendido

    • Utilize do ou :diffget no arquivo local (janela da esquerda) para atualizar de acordo com o conteudo do arquivo remoto (janela da direita)
    • Utilize dp ou :diffput no arquivo remoto (janela da direita) para atualizar de acordo com seu conteudo
    • Edite manualmente, copie e cole etc
  2. Salve o buffer da primeira janela e feche o editor para abrir o próximo arquivo a ser resolvido com :xa

Utilize :cq para abortar

Créditos