Come configuro e utilizzo Meld come mio git difftool?
git difftool mostra il diff usando un programma diff GUI (cioè Meld) invece di visualizzare l'output diff nel tuo terminale.
Sebbene sia possibile impostare il programma GUI sulla riga di comando mediante -t <tool> / --tool=<tool>
esso, ha più senso configurarlo nel .gitconfig
file. [Nota: vedere le sezioni relative alla fuga tra virgolette e percorsi di Windows in basso.]
# Add the following to your .gitconfig file.
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
cmd = meld "$LOCAL" "$REMOTE"
[Nota: queste impostazioni non modificheranno il comportamento git diff
che continuerà a funzionare normalmente.]
Usi git difftool
esattamente allo stesso modo in cui usi git diff
. per esempio
git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name
Se configurato correttamente, si aprirà una finestra Meld che mostra il diff utilizzando un'interfaccia GUI.
L'ordine dei riquadri della finestra della GUI di Meld può essere controllato dall'ordine di $LOCAL
e $REMOTE
in cmd
, vale a dire quale file è mostrato nel riquadro sinistro e quale nel riquadro destro. Se li vuoi viceversa, semplicemente scambiali in questo modo:
cmd = meld "$REMOTE" "$LOCAL"
Infine, la prompt = false
linea semplicemente impedisce a git di chiederti se vuoi avviare Meld o meno, per impostazione predefinita git emetterà un prompt.
Come configuro e uso Meld come mio git mergetool?
git mergetool ti permette di usare un programma di unione GUI (cioè Meld) per risolvere i conflitti di unione che si sono verificati durante un'unione.
Come difftool, puoi impostare il programma GUI sulla riga di comando usando -t <tool> / --tool=<tool>
ma, come prima, ha più senso configurarlo nel tuo .gitconfig
file. [Nota: vedere le sezioni relative alla fuga tra virgolette e percorsi di Windows in basso.]
# Add the following to your .gitconfig file.
[merge]
tool = meld
[mergetool "meld"]
# Choose one of these 2 lines (not both!) explained below.
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
NON si utilizza git mergetool
per eseguire una fusione effettiva. Prima di usare git mergetool
esegui un'unione come al solito con git. per esempio
git checkout master
git merge branch_name
Se c'è un conflitto di unione, git mostrerà qualcosa del genere:
$ git merge branch_name
Auto-merging file_name
CONFLICT (content): Merge conflict in file_name
Automatic merge failed; fix conflicts and then commit the result.
A questo punto file_name
conterrà il file parzialmente unito con le informazioni sul conflitto di unione (che è il file con tutte le voci >>>>>>>
e <<<<<<<
in esso).
Ora è possibile utilizzare Mergetool per risolvere i conflitti di unione. Lo inizi molto facilmente con:
git mergetool
Se configurato correttamente, si aprirà una finestra Meld che visualizza 3 file. Ogni file sarà contenuto in un riquadro separato della sua interfaccia GUI.
Nella .gitconfig
voce di esempio sopra, vengono suggerite 2 linee come [mergetool "meld"]
cmd
linea. In effetti ci sono tutti i tipi di modi per gli utenti avanzati di configurare la cmd
linea, ma questo va oltre lo scopo di questa risposta.
Questa risposta ha 2 cmd
linee alternative che, tra loro, soddisfano la maggior parte degli utenti e saranno un buon punto di partenza per utenti avanzati che desiderano portare lo strumento al livello successivo di complessità.
Innanzitutto ecco cosa significano i parametri:
$LOCAL
è il file nel ramo corrente (ad es. master).
$REMOTE
è il file nel ramo da unire (ad esempio nome_ramo).
$MERGED
è il file parzialmente unito con le informazioni di conflitto di unione in esso.
$BASE
è l'antenato del commit condiviso di $LOCAL
e $REMOTE
, vale a dire il file com'era quando il ramo contenente $REMOTE
era stato originariamente creato.
Ti suggerisco di usare:
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
o:
[mergetool "meld"]
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
# See 'Note On Output File' which explains --output "$MERGED".
La scelta è se usare $MERGED
o $BASE
tra $LOCAL
e $REMOTE
.
In entrambi i casi, Meld visualizzerà 3 riquadri con $LOCAL
e $REMOTE
nei riquadri sinistro e destro e $MERGED
o $BASE
nel riquadro centrale.
In ENTRAMBI i casi, il riquadro centrale è il file che è necessario modificare per risolvere i conflitti di unione. La differenza sta proprio nella posizione di modifica iniziale che preferisci; $MERGED
per il file che contiene il file parzialmente unito con le informazioni sul conflitto di unione o $BASE
per l'antenato del commit condiviso di $LOCAL
e $REMOTE
. [Dato che entrambe le cmd
righe possono essere utili le tengo entrambe nel mio .gitconfig
file. La maggior parte delle volte uso la $MERGED
linea e la $BASE
linea è commentata, ma il commento può essere scambiato se invece voglio usare la $BASE
linea.]
Nota sul file di output: non preoccuparti che --output "$MERGED"
venga utilizzato cmd
indipendentemente dal fatto che $MERGED
sia $BASE
stato usato in precedenza nella cmd
riga. L' --output
opzione indica semplicemente a Meld in quale nome di file git desidera salvare il file di risoluzione dei conflitti. Meld salverà le modifiche ai conflitti in quel file indipendentemente dal fatto che tu usi $MERGED
o $BASE
come punto di modifica iniziale.
Dopo aver modificato il riquadro centrale per risolvere i conflitti di unione, è sufficiente salvare il file e chiudere la finestra Combina. Git eseguirà l'aggiornamento automaticamente e il file nel ramo corrente (ad es. Master) conterrà ora tutto ciò che hai trovato nel riquadro centrale.
git avrà eseguito un backup del file parzialmente unito con le informazioni di conflitto di unione in esso aggiungendo .orig
al nome file originale. es file_name.orig
. Dopo aver verificato che sei soddisfatto dell'unione e aver eseguito tutti i test che potresti voler fare, il .orig
file può essere eliminato.
A questo punto ora puoi eseguire un commit per eseguire il commit delle modifiche.
Se, durante la modifica dei conflitti di unione in Combinazione, si desidera abbandonare l'uso di Combinazione, quindi chiudere Combinazione senza salvare il file di risoluzione di unione nel riquadro centrale. git risponderà con il messaggio file_name seems unchanged
e poi chiederà Was the merge successful? [y/n]
, se rispondi, n
la risoluzione del conflitto di unione verrà interrotta e il file rimarrà invariato. Nota che se hai salvato il file in Meld in qualsiasi momento, non riceverai l'avviso e il prompt da git. [Ovviamente puoi semplicemente eliminare il file e sostituirlo con il .orig
file di backup che git ha creato per te.]
Se hai più di 1 file con conflitti di unione, git aprirà una nuova finestra di fusione per ognuno, uno dopo l'altro fino a quando non saranno stati completati. Non saranno tutti aperti contemporaneamente, ma quando finisci di modificare i conflitti in uno e chiudi Meld, git aprirà il successivo e così via fino a quando tutti i conflitti di unione non saranno stati risolti.
Sarebbe sensato creare un progetto fittizio per testare l'utilizzo git mergetool
prima di utilizzarlo su un progetto dal vivo . Assicurati di utilizzare un nome file contenente uno spazio nel test, nel caso in cui il tuo sistema operativo richieda di sfuggire alle virgolette nella cmd
riga, vedi sotto.
Caratteri di citazione di escape
Alcuni sistemi operativi potrebbero dover avere le virgolette in cmd
escape. Gli utenti meno esperti dovrebbero ricordare che le righe di comando di configurazione devono essere testate con nomi di file che includono spazi e se le cmd
linee non funzionano con i nomi di file che includono spazi, prova a sfuggire alle virgolette. per esempio
cmd = meld \"$LOCAL\" \"$REMOTE\"
In alcuni casi potrebbe essere necessario scappare virgolette più complesse. Il primo dei collegamenti del percorso di Windows di seguito contiene un esempio di triplo escape di ogni preventivo. È noioso ma a volte necessario. per esempio
cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"
Percorsi di Windows
Gli utenti Windows avranno probabilmente bisogno di un'ulteriore configurazione aggiunta alle cmd
linee di fusione . Potrebbe essere necessario utilizzare il percorso completo a meldc
, progettato per essere richiamato su Windows dalla riga di comando, oppure potrebbe essere necessario o desiderare utilizzare un wrapper. Dovrebbero leggere le pagine StackOverflow collegate di seguito che riguardano l'impostazione della cmd
linea Meld corretta per Windows. Dato che sono un utente Linux, non sono in grado di testare le varie cmd
linee di Windows e non ho ulteriori informazioni sull'argomento oltre a raccomandare di usare i miei esempi con l'aggiunta di un percorso completo a Meld o meldc
, o l'aggiunta della cartella del programma Meld alla tua path
.
Ignorando gli spazi bianchi finali con Meld
La combinazione ha una serie di preferenze che possono essere configurate nella GUI.
Nella Text Filters
scheda delle preferenze ci sono diversi filtri utili per ignorare cose come i commenti quando si esegue un diff. Sebbene ci siano filtri da ignorare All whitespace
e Leading whitespace
, non esiste alcun Trailing whitespace
filtro da ignorare (questo è stato suggerito come aggiunta nella mailing list di Meld ma non è disponibile nella mia versione).
Ignorare gli spazi vuoti finali è spesso molto utile, specialmente durante la collaborazione, e può essere aggiunto manualmente facilmente con una semplice espressione regolare nella Text Filters
scheda Preferenze di fusione .
# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$
Spero che questo possa aiutare tutti.