¿Cómo resuelve Git descubrir las similitudes entre dos conflictos?

Ok, aquí va mi Q. ¿"git rerere" compara hashes de dos files para descubrir la resolución? Es decir, supongo que tengo un file XML que contiene esta label:

<number>12</number> 

Cuando tengo un conflicto, ese número generalmente se cambia a algo así como 13, 14, etc., así que estoy atrapado con:

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

¿Puede resolverse automáticamente resolver este conflicto incluso si los numbers 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). Entonces, si registra la resolución para los numbers 12 y 13, ¿resolverá el conflicto con diferentes numbers? Sospecho que no lo hará, pero podría preguntar.

¿Puede resolverse automáticamente resolver este conflicto incluso si los numbers 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 puede hacer eso.

Cuando usa git rerere , le pide que recuerde dos cosas:

  • un conflicto específico (es decir, el text literal de los tíos que están en conflicto y los files en los que se encuentran); y
  • la resolución que se debe aplicar a ese conflicto

Debido a que estos son literales trozos (por ejemplo, "reemplaza 12 por 13") en lugar de algún tipo de function de transformación (por ejemplo, "reemplaza N por N + 1"), git no puede inferir que deseas replace cada número por uno más alto.

Si más tarde Git encuentra 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 numbers siempre son uno).

Una salida es posible si este file 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 time de ejecución. Entonces nunca tendrás los conflictos correspondientes para limpiar.

Otro enfoque consiste en evitar que git rerere completo y, en su lugar, escribir un controller de combinación personalizado que resuelva las cosas por 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 el enlace en la respuesta de Karl .

Vanilla Git no compara files 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 controller de combinación personalizado" en la página del command man gitattributes . Le permite escribir su propio progtwig para resolver ciertas fusiones de la forma que desee, incluso elegir el número más alto.