- Clone o projeto na branch específica
git clone --branch answers1 [email protected]:nenitf/exemplo_vim-merge-conflict.git
cd exemplo_vim-merge-conflict
- Force o conflito
git pull origin answers2 --no-rebase
Fugitive (diretamente no vim)
-
Veja o status com
:G
-
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
-
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 oud3o
do 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
: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 usargit mergetool
, retome o status de "não resolvido" do arquivo comgit update-index --unresolve arquivo_existente.txt
ou 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 LO
para optar pelo local e:diffg RE
para 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 LO
para optar pelo local e:diffg RE
para 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
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
- Utilize
-
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