La mejor herramienta de combinación para reemplazar vimdiff
Esto es algo irónico, pero es a lo que terminé convergiendo como vimmer después de probar vimdiff.
Para resolver un conflicto de fusión, lo que casi siempre necesito es ver:
- REMOTO
- LOCAL
- dos diferencias:
- diff BASE REMOTE
- diff BASE LOCAL
para luego tratar de juntarlos a ambos.
Mientras que vimdiff muestra BASE, LOCAL y REMOTE en la pantalla:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
No sé cómo hacer que muestre claramente esos dos diferenciales que necesito además de mirar a la derecha, a la izquierda, a la izquierda, varias veces.
Además, LOCAL y REMOTO ya son visibles en los marcadores de conflicto de git merge, por lo que no obtengo mucho de una herramienta que los muestra nuevamente.
Por lo tanto, en su lugar, creé mi propio "difftool" pequeño que realmente muestra los diffs que me faltaba:
~ / 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 aguas arriba .
E instálalo con:
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'
Ahora, cuando lo haces:
git mergetool -t cirosantilli-mergetool
muestra los dos diferenciales que quiero en el terminal, por ejemplo, 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
Entonces puedes ver aquí los dos diferenciales descargados en la terminal:
RealView_BASE_15560.py
vs RealView_LOCAL_15560.py
RealView_BASE_15560.py
vs RealView_REMOTE_15560.py
Si las diferencias son grandes, solo buscaré mis superpoderes tmux .
Sí, usted pierde algunos accesos directos que proporciona vimdiff, pero en general la resolución de conflictos requiere copiar y pegar cuidadosamente las dos versiones, lo que puedo hacer bien dentro de una sesión vim normal con los marcadores de conflicto git.
Observar y diferenciar archivos mientras se vimdiff
está ejecutando
Antes de sentarme y automatizar mi configuración perfecta cirosantilli-mergetool
, esto es lo que estaba haciendo para obtener los dos diferenciales que necesitaba.
Mientras se git mergetool
está ejecutando vimdiff
, si hay un conflicto en un archivo llamado, digamos main.py
, git genera archivos para cada una de las versiones, nombradas como:
main_BASE_1367.py
main_LOCAL_1367.py
main_REMOTE_1367.py
en el mismo directorio main.py
donde 1367
está el PID de git mergetool y, por lo tanto, un entero "aleatorio", como se menciona en: En un conflicto de git merge, ¿cuáles son los archivos BACKUP, BASE, LOCAL y REMOTE que se generan?
Entonces, para ver las diferencias que quiero, primero encuentro los archivos generados git status
y luego abro nuevos terminales y hago un vimdiff entre los pares de archivos que me interesan:
vim -d main_BASE_1367.py main_LOCAL_1367.py
vim -d main_BASE_1367.py main_REMOTE_1367.py
Juntos con git mergetool
, esta información ayuda MUCHO a descubrir lo que está sucediendo rápidamente!
Además, incluso mientras se está ejecutando mergetool, solo puede abrir el archivo:
vim main.py
directamente y edítelo allí si cree que va a ser más fácil con una ventana de editor más grande.
Salta directamente para fusionar conflictos
Mientras ]c
salta al siguiente punto de diferencia dentro de vimdiff, no siempre hay un conflicto de fusión allí.
Para ayudar con esto, tengo en mi ~/.vimrc
:
# Git Merge conflict
nnoremap <leader>gm /\v^\<\<\<\<\<\<\< \|\=\=\=\=\=\=\=$\|\>\>\>\>\>\>\> /<cr>
que encuentra los conflictos directamente.
git imerge
Quizás la mejor opción es simplemente renunciar al uso de vimdiff y confiar en vim + git imerge regular, que se mencionó en: ¿Cómo puedo averiguar qué compromisos de Git causan conflictos? dado que la curva de aprendizaje de vimdiff es molesta y no cumple las funciones que más necesitamos.