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:
- CONTROLO REMOTO
- LOCAL
- duas diferenças:
- diff BASE REMOTE
- diff BASE LOCAL
para tentar juntar os dois.
Enquanto o vimdiff mostra BASE, LOCAL e REMOTE na tela:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
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
#!/usr/bin/env bash
BASE="$1"
LOCAL="$2"
REMOTE="$3"
diff --color -u "$BASE" "$LOCAL"
diff --color -u "$BASE" "$REMOTE"
exit 1
GitHub upstream .
E instale-o com:
git config --global mergetool.cirosantilli-mergetool.cmd 'cirosantilli-mergetool $BASE $LOCAL $REMOTE'
git config --global mergetool.cirosantilli-mergetool.trustExitCode true
# If you want this to become your default mergetool.
#git config --global merge.tool 'cirosantilli-mergetool'
Agora, quando você faz:
git mergetool -t cirosantilli-mergetool
mostra as duas diferenças que eu quero no terminal, por exemplo, algo junto:
--- ./src/dev/arm/RealView_BASE_15560.py 2019-12-27 13:46:41.967021591 +0000
+++ ./src/dev/arm/RealView_LOCAL_15560.py 2019-12-27 13:46:41.979021479 +0000
@@ -994,7 +994,7 @@
def setupBootLoader(self, cur_sys, loc):
if not cur_sys.boot_loader:
- cur_sys.boot_loader = [ loc('boot_emm.arm64'), loc('boot_emm.arm') ]
+ cur_sys.boot_loader = [ loc('boot.arm64'), loc('boot.arm') ]
cur_sys.atags_addr = 0x8000000
cur_sys.load_offset = 0x80000000
@@ -1054,7 +1054,7 @@
]
def setupBootLoader(self, cur_sys, loc):
- cur_sys.boot_loader = [ loc('boot_emm_v2.arm64') ]
+ cur_sys.boot_loader = [ loc('boot_v2.arm64') ]
super(VExpress_GEM5_V2_Base,self).setupBootLoader(
cur_sys, loc)
--- ./src/dev/arm/RealView_BASE_15560.py 2019-12-27 13:46:41.967021591 +0000
+++ ./src/dev/arm/RealView_REMOTE_15560.py 2019-12-27 13:46:41.991021366 +0000
@@ -610,10 +610,10 @@
def attachIO(self, *args, **kwargs):
self._attach_io(self._off_chip_devices(), *args, **kwargs)
- def setupBootLoader(self, cur_sys, loc):
- cur_sys.boot_loader = loc('boot.arm')
- cur_sys.atags_addr = 0x100
- cur_sys.load_offset = 0
+ def setupBootLoader(self, cur_sys, boot_loader, atags_addr, load_offset):
+ cur_sys.boot_loader = boot_loader
+ cur_sys.atags_addr = atags_addr
+ cur_sys.load_offset = load_offset
Então você pode ver aqui as duas diferenças despejadas no terminal:
RealView_BASE_15560.py
vs RealView_LOCAL_15560.py
RealView_BASE_15560.py
vs RealView_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ção
Antes 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ção vimdiff
, se houver um conflito em um arquivo chamado, por exemplo main.py
, o git gera arquivos para cada uma das versões, denominadas como:
main_BASE_1367.py
main_LOCAL_1367.py
main_REMOTE_1367.py
no mesmo diretório em main.py
que 1367
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:
vim -d main_BASE_1367.py main_LOCAL_1367.py
vim -d main_BASE_1367.py main_REMOTE_1367.py
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:
vim main.py
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
:
# Git Merge conflict
nnoremap <leader>gm /\v^\<\<\<\<\<\<\< \|\=\=\=\=\=\=\=$\|\>\>\>\>\>\>\> /<cr>
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.