Desde la página de manual de git-merge, hay una serie de estrategias de combinación que puede usar.
resolver : esto solo puede resolver dos cabezas (es decir, la rama actual y otra rama de la que extrajo) utilizando el algoritmo de combinación de 3 vías. Intenta detectar cuidadosamente las ambigüedades de fusión entrecruzadas y se considera generalmente seguro y rápido.
recursivo : esto solo puede resolver dos cabezas utilizando el algoritmo de fusión de 3 vías. Cuando hay más de un ancestro común que se puede usar para la fusión de 3 vías, crea un árbol fusionado de los ancestros comunes y lo utiliza como árbol de referencia para la fusión de 3 vías. Se ha informado que esto da como resultado menos conflictos de fusión sin causar fusiones erróneas mediante pruebas realizadas en confirmaciones de fusión reales tomadas del historial de desarrollo del kernel de Linux 2.6. Además, esto puede detectar y manejar fusiones que involucran cambios de nombre. Esta es la estrategia de fusión predeterminada al extraer o fusionar una rama.
pulpo : esto resuelve el caso de más de dos cabezas, pero se niega a hacer una fusión compleja que necesita resolución manual. Está destinado principalmente a usarse para agrupar cabezas de rama de tema juntas. Esta es la estrategia de fusión predeterminada al extraer o fusionar más de una rama.
la nuestra - Esto resuelve cualquier número de cabezas, pero el resultado de la fusión es siempre la cabeza de la rama actual. Está destinado a ser utilizado para reemplazar el antiguo historial de desarrollo de las ramas laterales.
subárbol : esta es una estrategia recursiva modificada. Al fusionar los árboles A y B, si B corresponde a un subárbol de A, B primero se ajusta para que coincida con la estructura de árbol de A, en lugar de leer los árboles al mismo nivel. Este ajuste también se realiza al árbol ancestro común.
¿Cuándo debo especificar algo diferente al predeterminado? ¿Para qué escenarios son los mejores?
git merge A B ...
).-X ours
es increíble, me ahorró una hora de trabajo.En realidad, las dos únicas estrategias que desearía elegir son las nuestras si desea abandonar los cambios generados por la rama, pero mantener la rama en el historial y el subárbol si está fusionando un proyecto independiente en el subdirectorio del superproyecto (como 'git-gui' en ' repositorio de git).
La combinación de pulpo se usa automáticamente cuando se fusionan más de dos ramas. la resolución está aquí principalmente por razones históricas y para cuando te golpean casos de esquina de estrategia de fusión recursiva .
fuente
theirs
estrategia de fusión (es decir--strategy=theirs
), pero hay unatheirs
opción para larecursive
estrategia de fusión predeterminada (es decir--strategy=recursive --strategy-option=theirs
, o simplemente-Xtheirs
).Estrategia de fusión "Resolver" vs "Recursiva"
Recursivo es la estrategia de dos cabezas predeterminada actual, pero después de algunas búsquedas finalmente encontré información sobre la estrategia de fusión "resolver".
Tomado del libro O'Reilly Version Control con Git ( Amazon ) (parafraseado):
He fusionado exitosamente árboles usando "resolver" que falló con la estrategia recursiva predeterminada. Estaba recibiendo
fatal: git write-tree failed to write a tree
errores, y gracias a esta publicación de blog ( espejo ) probé "-s resolve", que funcionó. Todavía no estoy exactamente seguro de por qué ... pero creo que fue porque tuve cambios duplicados en ambos árboles y resolví "omitirlos" correctamente.fuente
Como las respuestas anteriores no muestran todos los detalles de la estrategia. Por ejemplo, alguna respuesta le faltan los detalles acerca de la importación
resolve
opción y larecursive
que tiene muchas opciones secundarias comoours
,theirs
,patience
,renormalize
, etc.Por lo tanto, recomendaría visitar la
git
documentación oficial que explica todas las características posibles:https://git-scm.com/docs/merge-strategies
fuente