2012-04-18 13 views
5

Ok, aquí va mi Q. ¿"git rerere" compara hashes de dos archivos para descubrir la resolución? Esto es, decir que tengo un archivo XML que contiene esta etiqueta:¿Cómo resuelve Git descubrir las similitudes entre dos conflictos?

<number>12</number> 

Cuando tengo un conflicto, ese número por lo general se cambió a algo así como 13, 14, etc, por lo que tengo que cargar con:

<<<<<<< 
<number>12</number> 
======= 
<number>13</number> 
>>>>>>> 

¿Puede volver a resolver automáticamente este conflicto aunque los números no sean los mismos que la última vez? Siempre quiero que lo resuelva de tal manera que tome el número más alto (en el ejemplo anterior, 13). Entonces, si registra la resolución para los números 12 y 13, ¿resolverá el conflicto con diferentes números? Sospecho que no lo hará, pero podría preguntar.

Respuesta

7

¿Puede volver a resolver automáticamente este conflicto incluso si los números no son los mismos que la última vez? Siempre quiero que lo resuelva de tal manera que tome el número más alto (en el ejemplo anterior, 13).

No, git rerere no se puede hacer eso.

Cuando se utiliza git rerere, usted está pidiendo que recordar dos cosas:

  • un conflicto específico (es decir, el texto literal de los trozos que están en conflicto y los archivos que están en); y
  • la resolución que se debe aplicar a ese conflicto

Debido a que estos son hunk literales (por ejemplo, "reemplazar 12 con 13") en lugar de algún tipo de función de transformación (por ejemplo, "reemplazar N con N + 1 "), git no puede inferir que desea reemplazar cada número por uno más alto.

Si git encuentra posteriormente un conflicto que no coincide con ninguno de sus conflictos previamente recordados, es como si nunca hubiera encontrado ese conflicto, incluso si pudiera ser similar (como en su ejemplo donde los números son siempre uno apagado).

Una salida es posible si este archivo XML se genera automáticamente. En ese caso, es posible que desee considerar no mantenerlo en absoluto en el control de código fuente y, en su lugar, generarlo en tiempo de ejecución. Entonces nunca tendrás los conflictos correspondientes para limpiar.

Otro enfoque es evitar el git rerere en conjunto, y en su lugar escribir un controlador de combinación personalizado que resolverá las cosas para usted. Ya he hecho esto antes, pero es una cantidad de trabajo no trivial, y requiere que escriba y pruebe algún código. Si está interesado en esta estrategia, consulte the link en Karl's answer.

+0

Ah, pensé que sí. Gracias por una respuesta en profundidad.Desafortunadamente, estos números siempre los ingresan los humanos, por lo que parece que voy a echar un vistazo a ese controlador de combinación personalizado. Gracias por el consejo, tú y Karl. – mart1n

2

Vanilla git no compara los archivos de esa manera. Hace una comparación estricta de cadenas y no sabe nada sobre la semántica de la misma.

Sin embargo, consulte "Definición de un controlador de combinación personalizado" en el gitattributes man page. Le permite escribir su propio programa para resolver ciertas fusiones de la forma que desee, incluso elegir el número más alto.

Cuestiones relacionadas