¿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