2010-09-03 15 views
11

È possibile impostare Git up in modo che io possa utilizzare il confronto a tre vie in KDiff3?Fare un confronto a tre con Git e KDiff3

Ho due rami che sono troppo diversi per unirli automaticamente, devo semplicemente controllare ogni punto di unione e penso che il modo migliore sarebbe quello di controllare il ramo voglio le modifiche dall'altro ramo e dire

git difftool HEAD_OF_OTHER_BRANCH -- . 

E quindi selezionare Unisci file in KDiff3. Dopo aver esaminato i file che avrei appena commesso.

Ho impostato su merge.conflictstyle e diff.conflictstyle su diff3, ma KDiff3 inizia ancora con una differenza a due vie. È possibile? Immagino che se Git invia anche l'hash dell'antenato comune come parametro, questo è possibile, ma lo fa?

C'è discussion su come fare questo con SVN e BC3, ma non ho trovato nulla per Git e KDiff3.

+0

Se stai cercando di fare un unione a tre, perché non stai usando mergetool (invece di difftool)? –

+1

Non voglio che Git automatizzi qualcosa. Ho scoperto che forse potrei usare .gitattributes per dire a Git di non automatizzarsi. Ancora, l'unione fonderà l'intero sistema in una volta sola, preferirei gestirlo su una base per directory. Sì, questo è un casino, ma la mia intenzione è di pulirlo. Per quello sfortunatamente devo fare un po 'di lavoro manuale. – Makis

+0

@Makis: Sembrerebbe ragionevole fare un'unione corretta ma usare una strategia che non automatizza o forza il driver di unione "binario" tramite ".gitattributes" per lasciare sempre conflitti da risolvere per l'utente. Almeno in questo modo puoi utilizzare mergetool per avviare kdiff3 in modo logico. –

risposta

2

Sembra che git diff faccia solo un diff di 2 vie (che ha senso generare patch ecc.) Tranne che in uno stato di unione, devi fare una fusione per quello. L'altro giorno mi trovavo in una situazione simile e ho finito per fondermi usando la strategia ours. Funzionava ma non era l'ideale. Forse abbiamo bisogno di una strategia di fusione "non risolvibile" che non provi a risolvere eventuali conflitti. Potresti essere in grado di emularlo modificando i file .git/MERGE_ * e impostare tutti i file come in conflitto.
In caso contrario, la soluzione più ovvia è quella di cassa 3 directory diversa e kdiff3, ma credo che siete alla ricerca di una soluzione più elegante

+0

Controllare su directory diverse sarebbe ok, eccetto come crei la terza dir che contiene gli antenati comuni? Fintanto che lavoro su un singolo repository, Git rappresenta gli antenati comuni per me. – Makis

+1

@makis è possibile utilizzare il comando 'git merge-base' per trovare l'antenato comune di due commit, a portata di mano. – mb14

+0

Hm, quindi l'antenato comune è lo stesso per tutti i file? Ho pensato che questo potrebbe variare a seconda di quando un file viene modificato. Se è lo stesso per ogni file, allora questa sarebbe sicuramente una soluzione praticabile. – Makis

9

Eseguire questo sulla riga di comando:

git config --global mergetool.kdiff3.path /path/for/your/kdiff3/binary 

Poi, quando la risoluzione dei conflitti devi solo fare:

git mergetool --tool=kdiff3 
+0

proprio quello che stavo cercando! –

Problemi correlati