jueves, 8 de octubre de 2015

Como fusionar o hacer "merge" en Git si tengo muchos cambios en diferentes ramas. Mi opción favorita

Este es un problema común si por alguna razón te enfermaste o hiciste muchos cambios en diferentes ramas con diferentes commits y evitar tener conflictos antes de intentar subir tus cambios a master.

Imaginemos que tengo La rama A, B y Master

Nuestro master esta actualizado (already updated)

En A tengo los commits: A5,A4,A3,A2,A1 adelante de master(ahead master)
En B tengo los commits: B2, B1 adelante de master(ahead master)

A es mucho más grande pero eso nos da igual. Lo primero que tenemos que tener claro es que las 2 ramas ya han sido revisadas y aprobadas por nosotros a algún otro compañero y están preparadas para enviar(ready to ship).

Pasos.

1. Hacer rebase en una de las ramas

git checkout A

usamos rebase y por ejemplo usamos "squash", aqui puedes ver la documentación:

git rebase -i HEAD~5

m A5 "el primero"
squash A4
s AX
s ""
...

realizar los cambios en nuestor editor de texto y guardarlo para convertir todo un solo commit.
Este commit lo puedo usar ahora en otra rama.

2. Hacer rebase en la otra rama.

git checkout B

ahora hago el mismo procedimiento que arriba, la diferencia es que ahora solo son 2 commits.

Esto lo hago por que una vez que pase un commit a la rama que hare merge en master no podre cambiar los commits anterirores al comit que copiare de una de las ramas y lo pasare a la que quiero enviar el codigo a master. Así quedará todo más limpio


3. Elegir cual de las 2 hare merge.
Aconsejo usar la rama más importante de las 2. En caso de que las 2 sean imporantes también puedes crear una nueva rama  prepararla explicarlo todos los cambios de las otras 2 . Para evitar malentendidos con los comapañeros lo mejor es poner los 2 links en comentarios en las 3 y cerrar las otras 2 dejando solo la nueva. 

En este caso suponemos que B es solo una serie de bugs(errores) y A es la imporante.

4. elegír commit (cherry-pick), pasarlo y resolver conflictos.

git checkout B

Copiar el los comentarios del commit en si en algún lugar, más adelante lo podras usar.
Copiar numero de commit, será algo así como "asgfh3658" al lado del commit a la derecha.

git checkout A

git cherry-pick #num_del_commit

Ahora, cruza los dedos a ver si no hay ningun conflicto, sino, no pasa nada, a resolver conflictos :). Borra una de las 2 opciones dejando la otra y borrando las lineas extra.

Una vez resueltos los conflictos:

git add .
git commit -m "aquí pega los comentarios, si todo está en ordén tienes que poner la misma info del commit" 

5. Pequeños detalles finales como cambiar info del commit y fecha de publicación.

cambiar la info del ultimo commit:

git commit --amend -m "nuevo commit" ó
git commit --amend 
Con este ultimo te lleva a tu editor predeterminado, puedes borrar parte del commit antiguo y dejar el resto.

Listo!
No fue tan difícil verdad? Quiza es un poco lio, pero creeme, es una de las formas más sencillas de hacerlo.

No hay comentarios:

Publicar un comentario