Strumenti esterni di diff e merge
Il visualizzatore di diff di Gitcito e il risolutore a tre pannelli coprono quasi tutte le giornate. Certe giornate no: un file generato di 4.000 righe, un merge in cui devi vedere quattro colonne insieme, o semplicemente lo strumento che usi da dieci anni e che leggi più in fretta di qualunque novità.
Impostazioni → Generali → Strumenti esterni di diff e merge.
L'elenco è di git, non nostro
Gitcito non tiene una tabella propria. I menu a tendina sono
git difftool --tool-help e git mergetool --tool-help, ed è per questo che:
Gli strumenti che git ha già trovato sulla tua macchina sono elencati per primi; quelli che conosce ma non riesce a trovare vengono dopo, segnati come non installato.
Uno strumento personalizzato funziona senza alcun supporto aggiuntivo. Se hai
git config --global difftool.mine.cmd 'mycompare "$LOCAL" "$REMOTE"'allora
minecompare nel menu come qualunque strumento integrato.Le tue scelte vengono scritte in
diff.toolemerge.toolnella tua configurazione git globale — le stesse chiavi che legge il tuo terminale. Impostale qui egit difftoolda riga di comando si comporta allo stesso modo. Impostale là e Gitcito le raccoglie.
Git conosce già in partenza una trentina di strumenti, fra cui Kaleidoscope, Beyond Compare, Meld, KDiff3, P4Merge, Araxis, DiffMerge, WinMerge, FileMerge, VS Code e la famiglia vim.
Dove compaiono le azioni
| Superficie | Azione |
|---|---|
| Un file modificato nel compositore di commit | Diff in <strumento> — albero di lavoro contro l'indice |
| Il risolutore di conflitti | Merge in <strumento> — il merge a tre vie completo |
Entrambe le voci compaiono solo quando uno strumento è davvero configurato; un
git difftool non configurato darebbe solo errore, e un pulsante inerte è peggio
di nessun pulsante.
Cosa succede mentre lo strumento è aperto
Gitcito aspetta che si chiuda. È voluto — git mergetool mette in stage il file
risolto solo dopo l'uscita dello strumento, quindi c'è un risultato vero da
riportare — ed è il motivo per cui il pulsante mostra un indicatore di attesa
invece di tornare subito.
Il resto dell'applicazione resta reattivo: queste operazioni girano fuori dal lock per repository che serializza le normali operazioni git, quindi uno strumento di merge lasciato aperto durante la pausa pranzo non congela la scheda dietro di lui.
Quando un merge esterno riesce, è git stesso a mettere in stage il file e Gitcito chiude il risolutore e aggiorna. Se chiudi lo strumento senza salvare, git lo dice e non cambia nulla.
Il file .orig
git mergetool lascia per default un backup <file>.orig accanto al file
risolto — è comportamento di git, non di Gitcito. L'interruttore nelle
impostazioni scrive mergetool.keepBackup; disattivalo e un file risolto non
lascia più niente dietro di sé.
Limiti
- Solo diff sull'albero di lavoro. La voce del compositore confronta quello che hai adesso con l'indice. Confrontare esternamente due commit storici non è collegato — per quello usa il visualizzatore di diff integrato o il confronto.
- Un file alla volta. Non esiste una passata "fai il diff di ogni file modificato".
- Gitcito non installa mai niente. Uno strumento segnato non installato resta selezionabile, perché git potrebbe comunque trovarlo dopo che lo installi — ma fino ad allora fallirà.