Saltar al contenido

estrategias de fusión

mergeconflicts

Estrategias de fusión de Git

Cuando el trabajo está completo y listo para fusionarse en la línea principal de desarrollo, debemos elegir una estrategia de fusión.

Git combina cambios de diferentes ramas usando distintos métodos, conocidos como “estrategias de fusión”. Después de seleccionar una estrategia de fusión, Git crea un nuevo commit de fusión que combina los cambios de las ramas especificadas. Si no se especifica, el comando git merge seleccionará automáticamente una estrategia de fusión según las ramas proporcionadas. La opción -s se puede usar para especificar el nombre de la estrategia. Aquí está la lista de estrategias de fusión:

Recursive

git merge recursive strategy

bash
git merge -s recursive branch_name

Git selecciona recursive como estrategia predeterminada al hacer pull o fusionar ramas. La estrategia recursive puede detectar y gestionar fusiones que implican renombrados, pero no puede usar copias detectadas.

Resolve

merge resolve strategy

bash
git merge -s resolve branch_name

La estrategia resolve usa una fusión de 3 vías para resolver ramas y solo puede resolver dos HEAD usando un algoritmo de fusión de 3 vías. Es segura y rápida, y detecta con detalle las ambigüedades de fusiones en cruz.

Octopus

merge octopus strategy

bash
git merge -s octopus branch1 branch2 branch3

Cuando se pasan varias ramas al comando merge, se puede usar la estrategia octopus para combinarlas en un solo commit. Octopus se niega si la fusión tiene conflictos que requieren resolución manual. El uso básico de Octopus es agrupar HEAD de ramas de características que tienen similitudes.

Ours

merge ours strategy

bash
git merge -s ours branch_name

La estrategia ours resuelve múltiples ramas, pero el resultado siempre es el del HEAD de la rama actual. Ignora de forma muy eficaz todos los cambios de todas las demás ramas. Está pensada para usarse para reemplazar un historial antiguo de ramas secundarias.

Subtree

merge subtree strategy

bash
git merge -s subtree branch_name

La estrategia subtree es la versión modificada de la estrategia recursive. Por ejemplo, fusionamos los árboles A y B. Al corresponder a un subárbol de A, primero se modifica B para reflejar la estructura de árbol de A. La modificación se puede hacer en el árbol ancestro compartido de A y B.

Tipos de estrategias de fusión de git

Merge Commits (Explicit)

Las fusiones explícitas se consideran el tipo de fusión predeterminado. Se llaman explícitas porque crean un nuevo commit de fusión, cambiando el historial y mostrando dónde se invocó la fusión. El contenido del commit de fusión también se considera explícito, ya que muestra los commits padre del commit de fusión.

Fast-Forward Merges (Implicit)

Las fusiones fast-forward no crean un commit de fusión. Simplemente mueven el puntero de la rama de destino hacia adelante hasta el commit más reciente de la rama de origen. Este comportamiento se activa automáticamente cuando la rama de destino no se ha desviado de la rama de origen.

Squash Merges

Squash es una opción de fusión que evita crear un commit de fusión. Una fusión squash toma todos los commits de la rama de origen y los combina en un solo commit nuevo, que luego se aplica a la rama de destino. Esto normalmente se ejecuta usando la bandera --squash durante una fusión o un rebase interactivo. El historial de commits de la rama de origen se convierte en un único commit squash en la rama de destino.

Opciones de la estrategia de fusión recursive de git

oursFuerza que las partes en conflicto se resuelvan automáticamente favoreciendo la versión "nuestra". Los cambios del otro árbol que no entren en conflicto con nuestro lado se reflejan en la salida de la fusión.
theirsFavorece al otro árbol que se fusiona en la resolución de conflictos. No existe una estrategia de fusión "theirs" a diferencia de "ours".
patienceDedica mucho tiempo a evitar fusiones incorrectas que ocurren debido a líneas coincidentes sin importancia.
diff-algorithmIndica a "merge-recursive" que use un algoritmo diff diferente que ayuda a evitar fusiones incorrectas en líneas coincidentes sin importancia.
ignore-space-change / ignore-all-spaceSe centra en los caracteres de espacio en blanco. Los cambios de espacio en blanco mezclados con otros cambios no se ignoran.
renormalizeEjecuta una comprobación de salida y una comprobación de entrada en todas las etapas del archivo al resolver una fusión de 3 vías.
no-normalizeDesactiva la opción renormalize.
no-renamesIgnora los archivos renombrados durante la fusión.
find-renames=nActiva la detección de renombrados con un umbral de similitud. El umbral predeterminado es 50%.
subtreeTrabaja sobre los metadatos de ruta del árbol para hacer que los árboles coincidan.

Práctica

What are the different merge strategies in Git and their characteristics?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.