¿Qué reglas exactas sigue exactamente git / diff para determinar conflcts?

¿Cómo determina exactamente git que hay un conflicto entre líneas? ¿Qué reglas se siguen para determinar qué types de diferencias constituyen un conflicto y cuáles se pueden fusionar de manera segura?

Para un ejemplo particular, digamos que tenemos dos files csv . ¿Cuándo concluiría Git que dos files csv que comparten loggings (es decir, filas) no pueden fusionarse automáticamente?

Por ejemplo, supongamos que ambos csv incluyen el mismo set común de loggings, pero uno de ellos está agregando inputs, ¿podría esto causar un conflicto?

Depende de la herramienta utilizada para diff. Normalmente diffs compara líneas. Si se cambia una línea en una revisión y la misma línea se modifica en otra revisión, si intenta fusionarlas tendrá un conflicto.

diff se basa en resolver el problema de subsecuencia común más largo .

diff no sabe que una línea fue modificada. Sabe que se eliminó una línea (o varias líneas) y se insertó otra (o más de una) entre dos partes idénticas del file.

revisión A:

 abc def ghi 

revisión B:

 abc deaf ghi 

$ diff AB

La salida será eliminada y la línea deaf se insertó en el file B en comparación con el file A entre las líneas idénticas abc y ghi .

Si el file A se modifica en C:

 abc c debf ghi 

el diff generará que se eliminó la misma línea, pero se inserton las líneas c y debf .

Combinando B y C, el conflicto no será solo

 deaf ==== debf 

pero

 deaf ==== c debf 

Entonces, de una manera breve, diff busca bloques idénticos de líneas. Si los files se modificaron entre estos bloques en ambos files (y la modificación no fue idéntica), habrá un conflicto.

En realidad, puede usar su propio complemento para manejar conflictos en git si no le gusta la forma en que maneja sus conflictos.

Sin embargo, consulte esta página para get más información: http://en.wikipedia.org/wiki/Merge_%28revision_control%29#Three-way_merge