La fusione definitiva per sostituire vimdiff
Questo è un po 'ironico, ma è quello che ho finito per convergere come un vimmer dopo aver provato Vimdiff.
Per risolvere un conflitto di unione, ciò di cui ho quasi sempre bisogno è vedere:
- A DISTANZA
- LOCALE
- due differenze:
- diff BASE REMOTE
- diff BASE LOCALE
per poi provare a metterli insieme.
Mentre vimdiff mostra BASE, LOCAL e REMOTE sullo schermo:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
Non so come fare per mostrare chiaramente quei due diff che mi servono, inoltre, guardando a destra a sinistra a sinistra un sacco di volte.
Inoltre, LOCAL e REMOTE sono già visibili nei marker di conflitto di git merge, quindi non guadagno molto da uno strumento che li mostra di nuovo.
Pertanto, ho invece creato il mio piccolo "difftool" che in realtà mostra le differenze che mi mancavano:
~ / 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 a monte .
E installalo 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'
Ora, quando lo fai:
git mergetool -t cirosantilli-mergetool
mostra le due differenze che desidero sul terminale, ad esempio qualcosa:
--- ./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
Quindi puoi vedere qui i due diff scaricati nel terminale:
RealView_BASE_15560.py
vs RealView_LOCAL_15560.py
RealView_BASE_15560.py
vs RealView_REMOTE_15560.py
Se i diff sono grandi, cercherò solo con i miei superpoteri tmux .
Sì, perdi alcune scorciatoie fornite da vimdiff, ma in generale la risoluzione dei conflitti richiede un'attenta copia delle copie da entrambe le versioni, cosa che posso fare bene in una normale sessione di vim con i marker di conflitto git.
Osservare e diffondere file mentre vimdiff
è in esecuzione
Prima di sedermi e automatizzare la mia configurazione perfetta cirosantilli-mergetool
, questo è quello che stavo facendo per ottenere le due differenze di cui avevo bisogno.
Durante l' git mergetool
esecuzione vimdiff
, in caso di conflitto in un file denominato, ad esempio main.py
, git genera file per ciascuna delle versioni, denominate come:
main_BASE_1367.py
main_LOCAL_1367.py
main_REMOTE_1367.py
nella stessa directory di main.py
dove si 1367
trova il PID di git mergetool e quindi un numero intero "casuale", come menzionato in: In un conflitto di git merge, quali sono i file BACKUP, BASE, LOCAL e REMOTE che vengono generati?
Quindi, per vedere le differenze che voglio, prima trovo i file generati git status
, quindi apro nuovi terminali e faccio un vimdiff tra le coppie di file che mi interessano:
vim -d main_BASE_1367.py main_LOCAL_1367.py
vim -d main_BASE_1367.py main_REMOTE_1367.py
Insieme a git mergetool
, queste informazioni aiutano MOLTO a capire cosa sta succedendo rapidamente!
Inoltre, anche mentre mergetool è in esecuzione, puoi semplicemente aprire il file:
vim main.py
direttamente e modificalo lì se ritieni che sarà più facile con una finestra dell'editor più grande.
Salta direttamente per unire i conflitti
Mentre ]c
salta al successivo punto diff all'interno di vimdiff, non c'è sempre un conflitto di unione lì.
Per aiutare con questo, ho nel mio ~/.vimrc
:
# Git Merge conflict
nnoremap <leader>gm /\v^\<\<\<\<\<\<\< \|\=\=\=\=\=\=\=$\|\>\>\>\>\>\>\> /<cr>
che trova direttamente i conflitti.
git imerge
Forse l'opzione migliore è semplicemente rinunciare a usare vimdiff e fare affidamento su vim + git imerge che è stato menzionato in: Come posso sapere quale Git si commette causa conflitti? poiché la curva di apprendimento di vimdiff è fastidiosa e non svolge le funzioni di cui abbiamo più bisogno.