GIT: Branch, merge y resolución de conflictos

¿Para qué me sirve crear una rama?


Vamos a seguir con la serie de tutoriales de Git, en el anterior hilo vimos los comandos básicos para usar Git, si no lo habeis leido y sois nuevos os lo recomiendo.
En este apartado veremos:
  • Crear una rama nueva
  • Fusionar la rama nueva creada con la master
  • Resolver conflictos en la fusión de ramas
Una herramienta muy útil que tiene git es la creación de ramas, imaginemos que tenemos un proyecto, una vez hemos hecho un commit, nuestro jefe nos dice que quiere hacer unas mejoras al código ya generado, podríamos trabajar directamente y luego hacer un commit o lo que podriamos hacer es una rama nueva.

¿Qué conseguimos con esto?

Bien, imaginemos que dicho proyecto funciona correctamente, al crear esta rama nueva podemos estar trabajando sin ningún problema, que si algún compañero necesita descargar el trabajo desde la rama master, no se va a encontrar con que tiene trabajos a medio hacer porque tu estas haciendo mejoras, en trozos de códigos que ya funcionaban, así una vez tu trabajo de mejoras esté completado y testeado que funciona correctamente solo deberás hacer un merge a la rama master y listo, esta herramienta esta enfocada más al trabajo en equipo que en solitario, pero deberemos aprender a trabajar con ella para cuando estemos en una empresa.

git branch


Vamos a crear un nuevo directorio este lo denominaremos S2R1, iniciamos el repositorio git y creamos un archivo llamado 'actores.txt', escribimos tres actores y hacemos un commit.
Ahora creamos una nueva rama llamada test, con el comando:
git branch test
Ya tenemos la rama nueva creada, pero nosotros seguimos en la rama master, para cambiar de rama tenemos que usar el comando:
git checkout test
Ahora si, ya estamos en la rama que toca,este último comando sirve para posicionarnos sobre la rama que deseemos trabajar cambiando la posición a la que apunta el HEAD, una vez en este punto creamos un archivo que llamaremos 'actrices.txt', añadimos tres nombres y hacemos un commit.
Ahora usamos el comando git log --graph --all, que ya hemos visto en el anterior hilo y nos debería aparecer algo como esto.
Información importante que tenemos tras usar este comando:
Aparte de toda la información que dijimos en el anterior hilo, podemos ver que el la primera linea donde se identifica el commit, nos dice a que rama pertence y a donde apunta nuestro HEAD.

git merge


Ahora vamos a fusionar la rama master con la rama test, para ello deberemos volver a la rama master y usar el comando:
git merge test

Las ramas se han fusionado sin ningún problema, no será siempre así, lo siguiente que haremos será que en la fusión nos dé un error y como solucionarlo.
Consejo*: una forma facil de crear una rama y cambiar a ella en una sola orden es con el parametro -b en la orden git checkout -b test, estó creará dicha rama y modificará el HEAD del repositorio, es más comodo que tener que usar dos comandos.

Conflictos


Vamos a seguir trabajando sobre el mismo repositorio, ya tenemos nuestras dos ramas fusionadas, si quereis la rama que ya no vais a usar la podeis borrar con el comando git branch -d [nombre de la rama], vamos a crear una nueva rama llamada 'test2', ahora sin cambiar de rama (seguimos en master), modificamos el archivo 'actrices.txt', le añadiremos una actriz más.
Ahora la idea es cambiar a la rama test2 y añadir una actriz diferente al archivo 'actrices.txt'
OJO*: muy importante, antes de cambiar de rama para modificar el archivo en la rama test2, deberás haber hecho un commit, si no nos encontraremos que cuando cambiemos de rama, en la rama test2 el archivo 'actrices.txt', estará modificado igual que en la master.
Ahora que ya hemos modificado y confirmado los cambios en las dos ramas, vamos a ver que sucede si hacemos un git log --graph --all.
Este comando es muy util porque nos indica las ramas, los commits de cada rama y encima de una forma muy gráfica.
Vamos a proceder a su fusión. Cambiamos a master y usamos el comando git merge test2. Y nos debería aparecer algo así.
Nos ha surgido un conflicto, esto es debido a que hemos modificado la misma linea en las dos ramas y git no puede decidir cual debe borrar y cual debe seguir, así que ahora nos toca a nosotros ponernos manos a la obra y solucionar el error.

Resolver conflictos


Si usamos el comando git status, nos dará información de cual ha sido el conflicto.
Ya tenemos localizado el problema, ¿ahora qué hacemos?

Ahora solo deberemos usar nuestro editor de texto favorito y abrir el archivo que ha generado el problema y nos aparecerá lo siguiente.
Vemos cual ha sido el problema, en el mismo archivo, en la misma linea se ha introducido información diferente, a la parte de arriba vemos la información que hay en el archivo actrices.txt en la rama master, que és Penelope Cruz y más abajo después de la linea de iguales, vemos la información en la rama test2, nosotros solo deberemos elegir que linea de código preferimos. En mi caso soy más de Emma Watson, así que eliminaré a Penelope Cruz, recordad eliminar tambien todos los símbolos menor que, el nombre HEAD, los iguales y el nombre de la segunda rama. Una vez hecho todo eso, guardamos el archivo y deberemos hacer otro commit y listo las ramas estarán fusionadas.
Enhorabuena ya sabéis solucionar conflictos, estos conflictos si uno trabaja en solitario es difícil que aparezcan, pero si trabajamos en equipo puede que sea nuestro pan de cada día y deberemos saber hacer frente a estos problemas.

Un último detalle antes de cerrar el hilo, si usamos de nuevo el comando git log --graph --all veremos los commits en las diferentes ramas y como ha evolucionado nuestro proyecto.

Conclusión


Hasta aquí el tutorial de ramas, fusiones y resolución de conflictos. Estas herramientas están enfocadas más al trabajo en grupo que al trabajo en solitario, pero debemos conocerlas para el día de mañana, cuando empecemos a trabajar en una empresa. Espero que os haya gustado y os haya sido útil, voy a intentar seguir con la temática de tutoriales de git, nos vemos en ellos. Un saludo.

Comentarios

Entradas populares