class: center, middle, inverse, title-slide # Python II y GitHub ### Licenciatura en Ciencias Genómicas, UNAM ### First version: 2021-08-13; Last update: 2025-09-09 --- <style type="text/css"> /* From https://github.com/yihui/xaringan/issues/147 */ .scroll-output { height: 80%; overflow-y: scroll; } /* https://stackoverflow.com/questions/50919104/horizontally-scrollable-output-on-xaringan-slides */ pre { max-width: 100%; overflow-x: scroll; } </style> ## Contenido 1. Buenas prácticas para el desarrollo de software colaborativo 2. [Especificar versiones en Git con tag](./leccion1-etiquetas/1-Etiquetas.html) 3. **[Trabajar con ramas en Git: git branch](./leccion2-ramas/2-Ramas.html)** 4. [Manejo de issues en GitHub](./leccion3-issues/3-issues.html) 5. [Gestión de un proyecto con GitHub](../leccion4-project/4-project.html) --- # Trabajar con ramas en Git ## Objetivo Al finalizar la lección, podremos trabajar con ramas en Git. Conoceremos cómo crear ramas dentro de nuestro repositorio, nos movernos entre distintas ramas y podremos fusionarlas. <img src="img/branches.png" width="500px" style="display: block; margin: auto;" /> --- ### Antes de ir a las ramas 🌳 ... 📖 *Libro – Capítulos alternativos* Un escritor tiene un manuscrito (master branch). En lugar de modificar directamente ese texto, crea una copia para probar un capítulo con un final alternativo. 👉 Las ramas permiten trabajar en paralelo en diferentes versiones de la historia, y luego decidir cuál integrar al libro final. 🛠️ * Construcción – Planos de remodelación* Tenemos la casa original (main branch). Un arquitecto hace una copia de los planos para diseñar una remodelación (nueva branch). Si el diseño nos gusta, se integra al plano original; si no, se descarta sin afectar la casa existente. 🎼 *Música – Versiones de una canción* Un músico compone una melodía principal (master branch). Después crea una versión acústica, otra con batería, y otra en remix. 👉 Cada versión es una branch: comparten la base pero exploran direcciones diferentes, y en cualquier momento puede decidirse cuál publicar o combinarlas. --- ## Introducción Imaginemos que estamos trabajando en nuestro proyecto de clase y queremos implementar una nueva funcionalidad en la que sabemos que quizás tengamos que invertir varios días. Posiblemente sea algo experimental, que no sabemos si llegará a incorporarse a nuestro proyecto global, o bien, es algo que tenemos claro que vamos a querer completar, pero que, dado que necesitaremos un tiempo indeterminado, es posible que en medio de nuestro trabajo tengamos que tocar el código "base/principal", en el estado en que lo tenemos en funcionamiento actualmente. <img src="img/twoBranches.png" width="400px" style="display: block; margin: auto;" /> --- ## Introducción Durante este proceso quisieramos que el código base/principal no se vea afectado por cambios o código inestable. ¿Para qué nos ayudan las ramas (branches)? - Añadir una nueva función - Solucionar un error - Trabajar de manera paralela - Controlar que código dudoso se fusione con el código principal <img src="img/branchesOctopus.jpeg" width="450px" style="display: block; margin: auto;" /> --- ## Ramas (Branches) 🌳 Las ramas son caminos que puede tomar el desarrollo de un software, algo que ocurre naturalmente para resolver problemas o crear nuevas funcionalidades. Una rama representa una línea independiente de desarrollo. <img src="img/branchesColab.png" width="350px" style="display: block; margin: auto;" /> Pensemos en las ramas como un forma de solicitar un **nuevo directorio de trabajo**, un nuevo entorno de desarrollo o un nuevo historial de proyecto. **Los nuevos commits se registrarán en el historial de la rama actual**, lo que crea una bifurcación en el historial del proyecto. --- ## 📌 Idea central Las ramas en Git/GitHub son como líneas de tiempo paralelas del proyecto. - Sirven para experimentar sin riesgo. - Permiten que varias personas trabajen en diferentes partes a la vez. - Luego, los cambios se pueden fusionar (merge) a la rama principal. --- ## La rama "master" o "main" Cuando inicializamos un proyecto con Git automáticamente nos encontramos en una rama a la que se denomina **master** o **main**. Esta rama es la principal de nuestro proyecto y a partir de la que podremos crear nuevas ramas cuando lo necesitemos. --- ## Listando las ramas existentes en mi repositorio El comando _git branch_ nos permite crear, listar y eliminar ramas, así como cambiar su nombre. Para obtener el listado de las ramas que se encuentran creadas en mi repositorio local usaremos: Sintaxis: .full-width[.content-box-yellow[git branch]] Resultado: .full-width[.content-box-yellow[$ git branch <br> \* master ]] --- ## Práctica 1. Abrir una terminal -- 2. Localizar nuestro repositorio local de trabajo -- 3. Ejecutar el comando .full-width[.content-box-yellow[git branch]] -- ¿Cúantas y cuáles son las ramas actuales en el repositorio? --- ## Creando una nueva rama Para crear una rama en nuestro repositorio usaremos el comando: Sintaxis: .full-width[.content-box-yellow[git branch [branch_name]]] Ejemplo: .full-width[.content-box-yellow[$ git branch feature]] --- ## Pasando de una rama a otra Para movernos entre las ramas usaremos el comando _git checkout_ seguido del nombre de la rama que queremos que se active. Sintaxis: .full-width[.content-box-yellow[git checkout [branch_name]]] Ejemplo: .full-width[.content-box-yellow[$ git checkout feature]] Resultado: .full-width[.content-box-yellow[Cambiado a rama 'feature']] --- ## Pasando de una rama a otra Para verificar que hayamos cambiado de rama podemos usar el comando _git branch_. La rama en la que estemos situados se marcará con un asterisco (*) y aparecerá en un color distinto. Ejemplo: .full-width[.content-box-yellow[$ git branch]] Resultado: <img src="img/currentBranch.png" width="200px" style="display: block; margin: auto auto auto 0;" /> --- ## Práctica 1. Abrir una terminal -- 2. Localizar nuestro repositorio local de trabajo -- 3. Revisar el estado del repositorio. No debe haber nada pendiente por confirmar. .full-width[.content-box-yellow[git status]] -- 4. Asegurate de estar en la rama _master/main_ y crea la rama _[tu nombre]_ .full-width[.content-box-yellow[git branch sah]] -- 6. Revisar las ramas de nuestro repositorio .full-width[.content-box-yellow[git branch]] -- 6. Pasar de la rama _master/main_ a la rama _[tu nombre]_ .full-width[.content-box-yellow[git checkout sah]] -- --- ## Pasando de una rama a otra Por ahora, **las dos ramas tienen exactamente el mismo contenido**, pero ahora podríamos empezar a hacer cambios en la rama _[tu nombre]_ y sus correspondientes commits; entonces los archivos de la rama _master/main_ y la rama _[tu nombre]_ tendrán contenido diferente, de modo que al pasar de una rama a otra habrá cambios en los archivos. <img src="img/gitCheckout.png" width="450px" style="display: block; margin: auto;" /> Si hacemos cambios en la rama _[tu nombre]_ y usamos el comando _git show-branch_ veremos una descripción más detallada de las ramas. --- ## Práctica 1. Abrir una terminal -- 2. Localizar nuestro repositorio local de trabajo -- 3. Estando en la rama _[tu nombre]_ ejecuta el comando: .full-width[.content-box-yellow[git show-branch]] -- 4. Editemos un archivo de su elección. Recuerda usar: git add git commit -m "[mensaje]" -- 5. Revisa la descripción detallada de las ramas. .full-width[.content-box-yellow[git show-branch]] -- ¿Notas que el nuevo commit solo se encuentra en la rama _[tu nombre]_? --- ## Práctica 7. Pasa a la rama _master_ o _main_ .full-width[.content-box-yellow[$ git checkout master]] -- 8. Revisa el contenido del archivo editado -- ¿Este archivo tiene los cambios que realizamos en la rama _[tu nombre]_? --- ## Fusionando ramas A medida que creemos ramas y cambiemos el estado de las carpetas o archivos en el proyecto llegará el momento en el que nos interese **fusionar ramas** para poder incorporar el trabajo realizado a la rama __master__ o __main__. El proceso de fusionado se conoce como __merge__. Git para procesar los merge comprueba los cambios que se han introducido al proyecto, combinando el código de ambas ramas. <img src="img/merge.png" width="500px" style="display: block; margin: auto;" /> --- ## Fusionando ramas Para hacer un *merge* nos situamos en una rama, en este caso la __master__ o __main__, y decimos con qué otra rama se debe fusionar el código. El siguiente comando, lanzado desde la rama _master o main_, permite fusionarla con la rama _[tu nombre]_. Sintaxis: .full-width[.content-box-yellow[git merge [branch_name] -m "mensaje"]] Ejemplo: .full-width[.content-box-yellow[$ git merge sah -m "fusionando cambios de la rama sah a la master"]] --- ## Práctica 1. Revisar la rama en la que estamos actualmente. .full-width[.content-box-yellow[$ git branch]] -- 2. Si no estamos en la rama _master o main_ cambiarnos a la rama principal. .full-width[.content-box-yellow[$ git checkout master]] -- 3. Fusiona el contenido de la rama _[tu nombre]_ con la rama _master o main_ .full-width[.content-box-yellow[$ git merge sah -m "fusionando cambios de la rama sha a la master"]] -- 4. Revisa el mensaje obtenido al hacer el merge -- 5. Revisa el contenido del archivo --- ## Eliminando de ramas En algunas circunstancias puede ser necesario eliminar una rama de nuestro repositorio local, por ejemplo, porque nos hayamos equivocado en el nombre al crearla. Para ello utilizaremos el comando __git branch__, pero agregaremos la opción __-d__ para indicar que es esa rama la que queremos eliminar. Sintaxis: .full-width[.content-box-yellow[git branch -d [branch_name]]] Ejemplo: .full-width[.content-box-yellow[$ git branch -d develop]] IMPORTANTE: Puede que esta acción no nos funcione porque hayamos hecho cambios que no se hayan salvado en el repositorio remoto, o no se hayan fusionado con otras ramas. Para forzar el borrado utilizaríamos la opción __-D__ --- ## Práctica Eliminaremos la rama develop-# .... 1. Revisar la rama en la que estamos actualmente .full-width[.content-box-yellow[$ git branch]] -- 2. Crear la rama _develop-#_ .full-width[.content-box-yellow[$ git branch develop-1]] -- 3. Eliminar la rama _develop-#_ (asegurate de estar fuera de la rama) .full-width[.content-box-yellow[$ git branch -d develop-1]] -- 4. Revisar las ramas disponibles .full-width[.content-box-yellow[$ git branch]] --- ## Subiendo ramas al repositorio remoto (GitHub) Hasta este momento, las ramas que hemos creado solo pueden ser vistas en nuestro repositorio local, estas ramas no se publicarán en Github a menos que nosotros lo indiquemos. Para que esto ocurra tenemos que realizar específicamente la acción de subir al repositorio remoto una rama determinada. Sintaxis: .full-width[.content-box-yellow[git push -u origin [branch_name]]] Ejemplo: .full-width[.content-box-yellow[$ git push -u origin docs]] .tiny[ Nota 1: [Generación de token personal](https://docs.github.com/es/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)] .tiny[ Nota 2: [Support for password authentication was removed on August 13, 2021](https://dev.to/arjuncodes/support-for-password-authentication-was-removed-on-august-13-2021-fixed-k1e) ] --- ## Eliminando ramas remotas Si la rama que queremos eliminar está en el repositorio remoto tendremos que hacer un push indicando la opción --delete, seguida del nombre de la rama que se deseamos borrar. Sintaxis: .full-width[.content-box-yellow[git push origin --delete [branch_name]]] Ejemplo: .full-width[.content-box-yellow[$ git push origin --delete test]] --- ## Práctica 1. Crear una nueva rama llamada _test#_ .full-width[.content-box-yellow[$ git branch test1]] -- 2. Subir la rama _test#_ al repositorio remoto .full-width[.content-box-yellow[$ git push -u origin test1]] -- 3. Borrar localmente la rama _test#_ .full-width[.content-box-yellow[$ git branch -d test1]] -- 4. Borrar la rama _test#_ del repositorio remoto .full-width[.content-box-yellow[$ git push origin --delete test1]] --- ## Descargando una rama del repositorio remoto A veces ocurre que se generan ramas en el repositorio remoto, por ejemplo, cuando han sido creadas por otros usuarios y subidas a GitHub, y necesitaremos acceder a ellas en el repositorio local para verificar los cambios o continuar el trabajo. En principio, esas ramas creadas por otros usuarios no están disponibles para nosotros en local, pero las podemos descargar. Sintaxis: .full-width[.content-box-yellow[git fetch]] --- ## Conclusión Por medio del uso de ramas podremos llevar un mejor control de nuestro código. Se trata de tener nuevos caminos mientras el código evoluciona, en paralelo a otras ramas que se puedan generar. - Creación de una funcionalidad que queramos integrar en un programa - Desarrollo de distintas funcionalidades de manera paralela - No afectaremos la rama principal --- --- ## Flujo de trabajo <img src="img/flujoTrabajo.png" width="750px" style="display: block; margin: auto;" />