estrategias de fusión

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
git merge -s recursive branch_nameGit 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
git merge -s resolve branch_nameLa 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
git merge -s octopus branch1 branch2 branch3Cuando 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
git merge -s ours branch_nameLa 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
git merge -s subtree branch_nameLa 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
| ours | Fuerza 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. |
|---|---|
| theirs | Favorece al otro árbol que se fusiona en la resolución de conflictos. No existe una estrategia de fusión "theirs" a diferencia de "ours". |
| patience | Dedica mucho tiempo a evitar fusiones incorrectas que ocurren debido a líneas coincidentes sin importancia. |
| diff-algorithm | Indica 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-space | Se centra en los caracteres de espacio en blanco. Los cambios de espacio en blanco mezclados con otros cambios no se ignoran. |
| renormalize | Ejecuta 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-normalize | Desactiva la opción renormalize. |
| no-renames | Ignora los archivos renombrados durante la fusión. |
| find-renames=n | Activa la detección de renombrados con un umbral de similitud. El umbral predeterminado es 50%. |
| subtree | Trabaja 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?