¿Por qué git genera conflictos durante una fusión que se resuelven automáticamente por la mayoría de las herramientas de combinación como kdiff3?

Como se indica en el título. Intenté search en Google esto pero no encontré ninguna explicación para él, así que miré la documentation de kdiff3 que proporcionaba alguna información. La situación con la que me estoy encontrando es hacer una fusión de una twig a otra, get un montón de conflictos y usar git mergetool para resolverlos uno por uno. Lo que ocurre es que para algunos files cuando se inicia kdiff3, aparece un cuadro de dialog que dice que hubo x conflictos de resolución automática y que no quedan conflictos, así que guardo el file y continúo.

Según la documentation de kdiff3, los conflictos se resuelven automáticamente si la línea se cambió en una sola versión del file. Es decir. la base es la misma que el file local o remoto, pero no ambos.

Mi pregunta es, si mi herramienta de fusión puede resolver automáticamente esto (he intentado algunos y todos ellos resuelven automáticamente algunos conflictos) y de hecho parece lógico lo que hace, ¿por qué incluso me sale un conflicto de git?

Una pregunta de seguimiento es: ¿cómo puedo hacer que git resuelva automáticamente estos conflictos incluso antes de abrir mi herramienta de fusión?

Un ejemplo sería:

base: line 1 line 2 line 3 local: line 1 line 2 line 3 remote: line 1 line abc line 3 

Creo que lo anterior entra en conflicto en Git, pero se resuelve automáticamente en kdiff3. Aunque podría ser un caso diferente, realicé fusiones que se resolvieron automáticamente antes, no puedo recordar el escenario exacto ya que se resolvió automáticamente.

Puede haber una serie de razones, pero muy probablemente debido a una diferencia en las preferences de fusión.

Algunos ejemplos de diferencias que kdiff3 se pueden configurar para ignorar:

  • espacio en blanco: una línea vacía y una línea con cuatro espacios
  • comentarios: /* This is the original comment */ y /* This is the modified comment */
  • numbers: number_of_diffs = 3 y number_of_diffs = 7

En cada uno de esos casos (y potencialmente muchos más) kdiff3 puede simplemente ignorar las diferencias, por lo que no tiene problemas para fusionarse. Git, por otro lado, te hará resolver los conflictos manualmente.

En su ejemplo, no hay una razón obvia de por qué cualquier herramienta (razonable) emitiría un conflicto de combinación. Pero, ¿y si el file base se hubiera creado en Linux, mientras que usted había editado el file local en Windows (o viceversa)? Entonces, posiblemente, los finales de línea habrían cambiado. Probablemente esto sea completamente invisible para usted, pero causaría un conflicto de fusión. Lo acabo de probar y obtuve el siguiente resultado:

 Auto-merging file.txt CONFLICT (content): Merge conflict in file.txt Automatic merge failed; fix conflicts and then commit the result. 

Entonces corrí:

 $ git mergetool merge tool candidates: meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse ecmerge p4merge araxis bc3 codecompare emerge vimdiff Merging: file.txt Normal merge conflict for 'file.txt': {local}: modified file {remote}: modified file Hit return to start merge resolution tool (kdiff3): 

Al tocar return, kdiff3 combinó silenciosamente los dos files (ni siquiera lo vi abierto) resolviendo felizmente la diferencia de espacios en blanco.

Puede que eso no sea exactamente lo que está sucediendo en su caso, pero es un ejemplo real de que Git no fusiona lo que kdiff3 resuelve automáticamente simplemente por el espacio en blanco.

    Intereting Posts