Git merge -X ellos no fusionan todos los cambios

He revisado una sucursal y quiero fusionarme en master. La twig está detrás del maestro, ya que el maestro no se ha fusionado con esta twig en dos semanas, por lo que quiero usar todos los cambios desde el maestro.

Yo hago lo siguiente:

git merge -s recursive -X theirs master 

En su mayor parte se fusiona, pero hay al less un par de puntos donde los conflictos no provienen de ellos.

Por ejemplo, hay una línea:

 #import "VMVideo_Private.h" 

Esto se eliminó del maestro en algún momento de las últimas dos semanas, pero como esta twig no se ha fusionado en las últimas dos semanas, todavía está allí en la sucursal.

Después de la fusión usando el theirs , todavía está allí.

Además, si trato de fusionar manualmente con solo un:

 git merge master 

Este conflicto particular no aparece en absoluto.

En la estrategia de fusión recursiva, -X theirs (o para el caso -X ours ) simplemente significa que en el caso de conflictos debería resolver automáticamente el conflicto eligiendo "su versión" (o "nuestra versión", con -X ours ) .

Si no hay conflicto, su selección -X no entra en juego en absoluto.

Por ejemplo, supongamos que en la versión original (base de combinación común), file foo.txt , línea 34, dicho Rumplestiltskin . Supongamos además que cambiaste esto a George Clooney . Y, finalmente, supongamos que el file foo.txt en realidad fue cambiado en el master , pero no cerca de la línea 34. Ahora pides a git que combine sus cambios (maestros) con los tuyos: mantiene tu cambio, donde Rumplestiltskin se convierte en Clooney, ya que no hay conflicto con sus cambios, donde foo.txt ahora afirma ser verdadero en lugar de falso. La fusión resultante ahora hace reclamos (que afirma son ciertos) sobre el Sr. Clooney, en lugar de un personaje de cuento de hadas.

(En algunos casos, git -que solo está haciendo una diff de las distintas versiones- decidirá que los cambios que usted y ellos hicieron a algún código (o text) se representan mejor por medio de algo que, semánticamente, no tiene sentido. El código Java, por ejemplo, puede sincronizarse falsamente en líneas con nada más que un corsé cerrado. Las fusiones resultantes pueden ser hilarantes o trágicamente malas. A veces, elegir un algorithm de diferencias modificado, por ejemplo, "paciencia diff", puede ayudar. nada ayuda.)

La mayoría de las veces, sus twigs se fusionan y la fuerza y ​​la raíz de cada punto divergente ocultan la diferencia. Hay un truco para arreglarlo.

Supongamos que desea fusionar de maestro a su cur de twig actual, después de hacer

 git merge -s recursive -X theirs master git commit 

luego hazlo (tienes que comprometerte primero):

 git diff --ignore-space-at-eol cur..master | git apply 

Esto simplemente compara las twigs fusionadas cur y master , y el diff se recogerá y aplicará como un parche.