- Clone o projeto na branch específica
git clone --branch answers1 git@github.com:nenitf/exemplo_vim-merge-conflict.git
cd exemplo_vim-merge-conflict- Force o conflito
git pull origin answers2 --no-rebaseFugitive (diretamente no vim)
-
Veja o status com
:G -
Acesse o arquivo com 3-way-split usando
dvcom 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
-
Resolva e salve o arquivo do meio, possibilidades:
- Utilize
dpno LOCAL ou REMOTE para atualizar a janela do meio - Utilize
:diffg //2para pegar atualizações do LOCAL ou:diffg //3do REMOTE para atualizar a janela do meio - Utilize
d2opara pegar atualizações do LOCAL oud3odo REMOTE para atualizar a janela do meio
- Utilize
-
Salve o buffer que está sendo mergeado e torneo staged dentro de
:G
Caso não tenha finalizado mas queira sair do merge, utilize
:cqao invés de:qapara avisar ao git que o merge não foi finalizado. Caso tenha saido sem querer com:qae não consiga voltar a usargit mergetool, retome o status de "não resolvido" do arquivo comgit update-index --unresolve arquivo_existente.txtou cancele tudo comgit merge --abort
- Configure o git mergetool corretamente no
~/.gitconfig
[mergetool]
keepBackup = false
[merge]
tool = vimdiff
#conflictstyle = diff3- 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
-
Utilize a cada demarcação
:diffg TIPO_DE_ARQUIVO_COM_A_OPÇÃO_CORRETA. Sendo::diffg LOpara optar pelo local e:diffg REpara o remoto -
Salve o buffer que está sendo mergeado com
:wqa
- Configure o git mergetool corretamente no
~/.gitconfig
[mergetool]
keepBackup = false
[merge]
tool = merge3
[mergetool "merge3"]
cmd = vim -d -c \"wincmd l\" \"$LOCAL\" \"$MERGED\" \"$REMOTE\"- 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
-
Utilize a cada demarcação
:diffg TIPO_DE_ARQUIVO_COM_A_OPÇÃO_CORRETA. Sendo::diffg LOpara optar pelo local e:diffg REpara o remoto -
Salve o buffer que está sendo mergeado com
:wqa
Com vimdiff adaptado usando plugin diffconflicts (meu favorito)
- Configure o git mergetool corretamente no
~/.gitconfig
[merge]
tool = diffconflicts
[mergetool "diffconflicts"]
cmd = nvim -c DiffConflicts \"$MERGED\" \"$BASE\" \"$LOCAL\" \"$REMOTE\"
trustExitCode = true
keepBackup = false- 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
-
Atualize a primeira janela com o estado pretendido
- Utilize
doou:diffgetno arquivo local (janela da esquerda) para atualizar de acordo com o conteudo do arquivo remoto (janela da direita) - Utilize
dpou:diffputno arquivo remoto (janela da direita) para atualizar de acordo com seu conteudo - Edite manualmente, copie e cole etc
- Utilize
-
Salve o buffer da primeira janela e feche o editor para abrir o próximo arquivo a ser resolvido com
:xa
Utilize
:cqpara abortar