informatica:programacion:cursos:control_version_git_avanzado:branching
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| informatica:programacion:cursos:control_version_git_avanzado:branching [2023/06/03 11:44] – tempwin | informatica:programacion:cursos:control_version_git_avanzado:branching [2023/06/03 16:41] (actual) – [Fusionando código: merge, rebase y cherry-pick] tempwin | ||
|---|---|---|---|
| Línea 28: | Línea 28: | ||
| Tenemos dos concepciones de ramas, una más " | Tenemos dos concepciones de ramas, una más " | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Poner gráfico con la representación de commits y dos ramas | + | |
| - | </ | + | |
| Esto hace que sea muy cómodo trabajar con ramas porque es muy fácil movernos entre ellas al ser un " | Esto hace que sea muy cómodo trabajar con ramas porque es muy fácil movernos entre ellas al ser un " | ||
| Línea 138: | Línea 136: | ||
| El propósito de una rama es que cuando terminemos con ella, la volquemos a otra rama principal. En este proceso de volcado, los commits que estaban en la rama paralela formarán parte de la rama principal. | El propósito de una rama es que cuando terminemos con ella, la volquemos a otra rama principal. En este proceso de volcado, los commits que estaban en la rama paralela formarán parte de la rama principal. | ||
| - | |||
| - | <WRAP center round todo 60%> | ||
| - | Mostrar gráfico con la explicación de arriba. | ||
| - | </ | ||
| Aunque hay otras metodologías, | Aunque hay otras metodologías, | ||
| Línea 151: | Línea 145: | ||
| Objetivo: que una rama tenga los commits de otra. | Objetivo: que una rama tenga los commits de otra. | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Mostrar gráfico con la explicación de arriba. | + | |
| - | </ | + | |
| Tipos de merge: | Tipos de merge: | ||
| Línea 168: | Línea 160: | ||
| Con el merge **fast forward** el código no cambia, sencillamente git apunta la rama master a donde la rama secundaria, no se crea ningún commit. | Con el merge **fast forward** el código no cambia, sencillamente git apunta la rama master a donde la rama secundaria, no se crea ningún commit. | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Mostrar gráfico con la explicación de arriba. | + | |
| - | </ | + | |
| <WRAP center round tip 60%> | <WRAP center round tip 60%> | ||
| Línea 178: | Línea 168: | ||
| Con el merge **a tres bandas**, en los casos en que tanto la rama principal y la secundaria avanzan por caminos distintos. | Con el merge **a tres bandas**, en los casos en que tanto la rama principal y la secundaria avanzan por caminos distintos. | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Mostrar gráfico con la explicación de arriba. | + | |
| - | </ | + | |
| La fusión **a tres bandas** crea un nuevo commit con el commit común a las dos ramas, el código de una rama y el código de la otra, por eso lo de "a 3 bandas" | La fusión **a tres bandas** crea un nuevo commit con el commit común a las dos ramas, el código de una rama y el código de la otra, por eso lo de "a 3 bandas" | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Mostrar gráfico con la explicación de arriba. | + | |
| - | </ | + | |
| Esta fusión puede ocasionar conflictos. Por ejemplo si estamos en la siguiente situación: | Esta fusión puede ocasionar conflictos. Por ejemplo si estamos en la siguiente situación: | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Mostrar gráfico con la explicación de arriba. | + | |
| - | </ | + | |
| Git no podrá decidir por nosotros y nos pedirá solucionar. | Git no podrá decidir por nosotros y nos pedirá solucionar. | ||
| Línea 238: | Línea 222: | ||
| A diferencia del **merge**, el **rebase** se aplica desde la rama origen. | A diferencia del **merge**, el **rebase** se aplica desde la rama origen. | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Añadir gráfico con resultado de rebase | + | |
| - | </ | + | |
| Después de un rebase tenemos que adelantar la rama principal ('' | Después de un rebase tenemos que adelantar la rama principal ('' | ||
| <WRAP center round important 60%> | <WRAP center round important 60%> | ||
| - | Si vamos a hacer un rebase, hay que pensar si hemos subido al repositorio remoto la rama secundaria. Si lo hemos subido, no podemos hacer **rebase** sino **merge**. **rebase** es una de las opciones de rescritura de la historia**. Si seguimos un modelo correcto de ramas, esto no debería ser un problema porque las ramas auxiliares nunca se suben al escritorio remoto pues las vamos borrando, solo son útiles en nuestro repositorio local mientras vamos desarrollando. | + | Si vamos a hacer un rebase, hay que pensar si hemos subido al repositorio remoto la rama secundaria. Si lo hemos subido, no podemos hacer **rebase** sino **merge**. **rebase** es una de las opciones de rescritura de la historia. Si seguimos un modelo correcto de ramas, esto no debería ser un problema porque las ramas auxiliares nunca se suben al escritorio remoto pues las vamos borrando, solo son útiles en nuestro repositorio local mientras vamos desarrollando. |
| </ | </ | ||
| Línea 267: | Línea 249: | ||
| * Confictos: lanzar siempre '' | * Confictos: lanzar siempre '' | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Añadir gráfico con ejemplo de cherry pick | + | |
| - | </ | + | |
| Al igual que el **merge**, **cherry-pick** se usa también desde la rama destino. | Al igual que el **merge**, **cherry-pick** se usa también desde la rama destino. | ||
| Línea 288: | Línea 268: | ||
| git cherry-pick --continue | git cherry-pick --continue | ||
| </ | </ | ||
| + | |||
| + | <WRAP center round tip 60%> | ||
| + | cherry-pick se podrá utilizar siempre y cuando se hayan hecho commits "con cabeza" | ||
| + | </ | ||
| + | |||
| ===== Métodos para mover referencias ===== | ===== Métodos para mover referencias ===== | ||
| Línea 356: | Línea 341: | ||
| ===== Git Flow ===== | ===== Git Flow ===== | ||
| + | |||
| + | Hasta ahora hemos ido viendo el **modelo general** de cómo trabajar con rama en git: | ||
| + | |||
| + | - Creamos una rama auxiliar | ||
| + | - Trabajamos en ella | ||
| + | - Fusionamos con **develop** | ||
| + | - Eliminamos la rama auxiliar | ||
| + | |||
| + | Esta metodología es un conjunto de buenas prácticas que nos aseguran no tener conflictos o al menos tener pocos y fáciles de resolver. | ||
| + | |||
| + | Cada empresa o programador puede tener su propio flujo. Hay una serie de métodos que comparte la comunidad. Uno de ellos es **git flow**, un modelo de // | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Tuvo mucho éxito y se ha convertido en uno de los métodos más utilizados. | ||
| + | |||
| ==== El modelo git flow ==== | ==== El modelo git flow ==== | ||
| - | El modelo | + | Este modelo |
| - | master branch | + | |
| - | develop branch | + | * **master** branch |
| - | feature branch | + | * **develop** branch |
| - | bugfix branch | + | |
| - | hotfix branch | + | A diferencia del modelo general, ambas ramas estarán vivas siempre, nunca se borrarán. |
| - | release branch | + | |
| - | Git avanzado | + | Cada vez que el código alcance un estado tal que podamos publicar la aplicación, |
| - | El programa | + | |
| - | (en Windows ya viene instalado con Git) | + | Ambas ramas son las únicas que compartiremos con el resto de desarrolladores, |
| + | |||
| + | Este modelo además tiene una serie tipos de ramas auxiliares: | ||
| + | |||
| + | * **feature** branch: cada vez que programemos algo nuevo, abrimos este tipo de rama (se abre a partir de la última versión de **develop**). Al terminar, se vuelca en develop y se borra la rama auxiliar. | ||
| + | * **bugfix** branch: similares a las // | ||
| + | * **hotfix** branch: para corregir errores que detectamos en **master**. Nace desde master y al terminar, la rama se fusionará con develop y master. | ||
| + | * **release** branch: sirven para hacer una puesta a producción. Cuando develop está lista para pasar a producción, | ||
| + | |||
| + | Toda esta metodología existe en un software llamado **git flow** que se puede instalar | ||
| Empezar a usar git flow en un repositorio: | Empezar a usar git flow en un repositorio: | ||
| + | |||
| + | < | ||
| git flow init | git flow init | ||
| + | </ | ||
| + | |||
| + | Nos preguntará cómo queremos llamar a las ramas. Git nos da unas propuestas, pero podemos poner lo que queramos. | ||
| + | |||
| + | El uso sería el siguiente: | ||
| + | |||
| Iniciar rama: | Iniciar rama: | ||
| + | |||
| + | < | ||
| git flow tipo_rama start nombre_rama | git flow tipo_rama start nombre_rama | ||
| - | Cerrar | + | </ |
| + | |||
| + | Cuando hayamos terminado con la rama: | ||
| + | |||
| + | < | ||
| git flow finish | git flow finish | ||
| + | </ | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | Si no estuviésemos en esa rama, el comando tendría que ser '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | Usando el programa **git flow**, no tenemos que recordar de dónde salen las ramas, a dónde se deben volcar, ya se encarga él. | ||
| ==== Poniendo en práctica git flow ==== | ==== Poniendo en práctica git flow ==== | ||
| + | |||
| + | Vemos el uso del programa **git flow** para facilitar el flujo de trabajo git flow. | ||
| + | |||
| + | Empezamos: | ||
| + | |||
| + | < | ||
| + | git flow init | ||
| + | </ | ||
| + | |||
| + | <WRAP center round todo 60%> | ||
| + | Poner ejemplo de salida por consola | ||
| + | </ | ||
| + | |||
| + | Comenzamos a trabajar: | ||
| + | |||
| + | < | ||
| + | git flow feature start readme | ||
| + | </ | ||
| + | |||
| + | Y se habrá creado la rama '' | ||
| + | |||
| + | Cuando terminemos de hacer cambios, cerramos la rama: | ||
| + | |||
| + | < | ||
| + | git flow feature finish readme | ||
| + | </ | ||
| + | |||
| + | <WRAP center round tip 60%> | ||
| + | Recordemos que si vamos a cerrar la rama en la que estamos, podemos abreviar con '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round info 60%> | ||
| + | El git flow está programado de manera que los **merge** sean a tres bandas, evitando el fast forward | ||
| + | </ | ||
| + | |||
| + | Cuando tengamos listo todo para publicar una versión, creamos un rama // | ||
| + | |||
| + | < | ||
| + | git flow release start v1.0.0 | ||
| + | </ | ||
| + | |||
| + | Al terminar: | ||
| + | |||
| + | < | ||
| + | git flow finish | ||
| + | </ | ||
| + | |||
| + | Si tenemos un error en producción, | ||
| + | |||
| + | < | ||
| + | git flow hotfix start idioma | ||
| + | </ | ||
| + | |||
| + | Git flow ya sabe que tiene que crearla a partir de master. Cuando terminemos de hacer los cambios y queramos cerrar la rama: | ||
| + | |||
| + | < | ||
| + | git flow finish | ||
| + | </ | ||
| + | |||
| + | El " | ||
| ===== Conclusión ===== | ===== Conclusión ===== | ||
| + | |||
| + | Hemos aprendido a trabajar con ramas, que es básicamente trabajar con referencias. | ||
| + | |||
| + | El **rebase** solo se puede hacer si la rama origen no la hemos subido al repositorio remoto. | ||
| + | |||
| + | El cherry-pick es muy útil para cuando no queremos traernos todo el trabajo de una rama. | ||
| + | |||
| + | El modelo git flow permite un flujo de trabajo con bajo número de conflictos. | ||
| ===== Recursos ===== | ===== Recursos ===== | ||
informatica/programacion/cursos/control_version_git_avanzado/branching.1685785486.txt.gz · Última modificación: por tempwin
