2010-09-03 6 views
11

¿Es posible configurar Git para que pueda usar la comparación tridireccional en KDiff3?Haciendo una comparación tripartita con Git y KDiff3

Tengo dos ramas que son demasiado diferentes para fusionarlas automáticamente, simplemente tengo que verificar cada punto de fusión y creo que la mejor manera sería verificar la rama Quiero los cambios de la otra rama y decir

git difftool HEAD_OF_OTHER_BRANCH -- . 

Y a continuación, seleccione Combinar archivo en KDiff3. Después de haber revisado los archivos, me gustaría comprometerlos.

He configurado merge.conflictstyle y diff.conflictstyle en diff3, pero KDiff3 todavía comienza con una diferencia bidireccional. es posible? Supongo que si Git también envía el hash del ancestro común como un parámetro, esto es posible, pero ¿verdad?

Hay discussion acerca de cómo hacer esto con SVN y BC3, pero no pude encontrar nada para Git y KDiff3.

+0

Si está intentando hacer una fusión de tres vías, ¿por qué no usa mergetool (en lugar de difftool)? –

+1

No quiero que Git automatice nada. Descubrí que quizás podría usar .gitattributes para decirle a Git que no automerge. Aún así, la fusión fusionará todo el sistema masivo de una sola vez, prefiero manejar esto en una base de directorio. Sí, esto es un desastre, pero mi intención es limpiarlo. Por eso, desafortunadamente, tengo que hacer algunos trabajos manuales. – Makis

+0

@Makis: Parecería sensato hacer una combinación adecuada pero usar una estrategia que no automatice ni fuerce al controlador de combinación 'binario' a través de '.gitattributes' para que siempre deje conflictos para que el usuario los resuelva. Al menos de esta manera puede usar mergetool para iniciar kdiff3 de la manera lógica. –

Respuesta

2

Parece que git diff solo hace un diff de 2 vías (lo que tiene sentido para generar parches, etc.), excepto en un estado de fusión, tiene que hacer una fusión para eso. El otro día estaba en una situación similar y terminé usando la estrategia ours. Eso funcionó pero no fue ideal. Tal vez necesitamos una estrategia de fusión 'no resuelta' que no intente resolver ningún conflicto. Es posible que pueda emular eso modificando los archivos .git/MERGE_ * y establezca todos los archivos como conflictivos.
lo contrario, la solución obvia es a la caja de 3 directorio diferente y ejecutar kdiff3, pero supongo que busca una solución más elegante

+0

Verificar en diferentes directorios estaría bien, excepto ¿cómo se crea el tercer directorio que contiene los antepasados ​​comunes? Mientras trabaje en un solo repositorio, Git se imagina a los ancestros comunes para mí. – Makis

+1

@makis puede utilizar el comando 'git merge-base' para encontrar el ancestro común de dos confirmaciones, útil. – mb14

+0

Hm, ¿entonces el ancestro común es el mismo para todos los archivos? Pensé que esto podría diferir dependiendo de cuándo se edita un archivo. Si es lo mismo para cada archivo, esta sería definitivamente una solución viable. – Makis

9

ejecutar esto en la línea de comandos:

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

Entonces, cuando la solución de conflictos solo tiene que hacer:

git mergetool --tool=kdiff3 
+0

¡justo lo que estaba buscando! –

Cuestiones relacionadas