Git Rebase - Escenarios

Este es un post que desde hace tiempo quería escribir, en el cual trataré de mostrar diferentes escenarios en nuestro flujo de trabajo donde podemos aplicar un rebase.

Primero que nada, ¿qué es un rebase?
Rebase es un comando de Git, que nos permite reorganizar nuestro historial de commits, ya sea para actualizar una rama, integrar cambios a una rama o simplemente mantener ordenado nuestro historial.

Como nota, hay que tener precaución con el rebase ya que "sobrescribe" el historial, pero no hay que tener miedo, si alguna vez existió un commit, siempre habrá forma de recuperarlos, pero ese es tema de otro post.

Comenzando

Vamos a comenzar con un escenario donde tenemos una rama principal master donde hacemos 3 commits iniciales, de éste último commit sale una rama hija develop donde hacemos dos commits y de éste último sale otra rama hija feature.

Despues de haber creado nuestra rama feature realizamos otros commits nuevos en nuestra rama padre develop, esto quiere decir que estos nuevos commits no estarán presentes en nuestra rama hija:

En el primer escenario no necesitamos de esos nuevos commits de nuestra rama padre develop en nuestra rama hija feature, simplemente hacemos un merge de nuestra rama hija feature a nuestra rama padre:

El otro escenario es que necesito uno de esos commits nuevos de mi rama padre develop en mi rama hija feature, aquí tenemos mas de una opción; la primera es hacer un cherry pick de ese commit a mi rama hija feature:

la segunda opción es hacer un merge de nuestra rama padre develop hacia nuestra rama hija feature, pero esto puede dejar algo desordenado nuestro historial.

Rebase

Aqui comenzamos con el rebase, antes que nada es muy importante asegurarnos de tener nuestra rama padre actualizada(hacer un pull siempre), el escenario es actualizar nuestra rama hija feature con los commits nuevos de nuestra rama padre develop

*aquí vemos como hay commits nuevos en nuestra rama develop y después otros commits en nuestra rama feature*

Con el rebase vamos a tomar los commits nuevos de nuestra rama develop integrarlas al inicio de nuestra rama hija feature:

y "encima" de esos nuevos commits pondremos los commits de nuestra rama feature:

Al hacer un rebase, al momento de poner los commits de nuestra rama hija encima, git va ir poniendo commit por commit, uno por uno, y si en alguno de nuestros commits hay un conflicto habrá que resolverlo commit por commit, una vez resueltos continuamos el rebase con el comando:

$ git rebase --continue 

y si por alguna razón queremos cancelar el rebase, ejecutamos:

$ git rebase --abort

una vez terminado el rebase, nuestra rama hija feature tendrá los commits nuevos de nuestra rama padre develop y estarán a la par, aquí podemos hacer un merge (no fast forward) a nuestra rama develop y se hará sin conflictos:

o hacer un merge fast forward para mantener un historial lineal y "limpio":

Con esto podemos ver algunos escenarios y como funciona un git rebase, otra opción interesante es el rebase interactivo pero en otro post lo veremos.