Skip to content

Instantly share code, notes, and snippets.

@spiccinini
Created December 7, 2018 03:11
Show Gist options
  • Save spiccinini/0d31378f7ed75b14e104b27162751afd to your computer and use it in GitHub Desktop.
Save spiccinini/0d31378f7ed75b14e104b27162751afd to your computer and use it in GitHub Desktop.
How to merge lots of changes into master

Cómo mergear un branch con muchos cambios en master

O Como hacer que lo que hiciste en un sprint entre en master

Actualzarse con master

Tengo mi branch lleno de cambios "muchas_cosas"

$ git checkout muchas_cosas

Me traigo los cambios de master y hago un commit para que mergee lindo (muchas_cosas) $ git merge origin/master

Aca pruebo que siga andando algo!

Análisis de cambios

Miro todos los cambios que hay contra master y analizo en que grupo de cambios quiero dividir los commits. Lo mas importante es pensar que una sola persona pueda entender todos los cambios. Por ejemplo si hay cambios en power y en nvram y en algo de python, es poco probable que haya alguien que se sienta comodo con esas 3 cosas. Entonces mejor separar en 3 grupos, etc.

Para browsear todos los cambios $ git diff muchas_cosas master tambien sirve algo como $ git difftool --tool=meld --dir-diff muchas_cosas master

Cuando ya sabes en que grupos dividir las cosas, generalmente esos grupos contienen distintos archivos, entonces vamos a usar eso para generar commits con los cambios. Podria ser que uno prefiera hacer cherry pick en vez de esto, cualquiera de las dos cosas vale. Lo que suele suceder cuando uno esta laburando en un sprint o algo es que tenes 20 commits tocando 3 lineas de codigo y quizas lo mejor es dejar un solo commit.

Agrupando los cambios

Nos vamos a master (master) $ git checkout master

creo un branch para un grupo de cambios saliendo de master

(grupo_a) $ git checkout -b grupo_a

Opción Juntando muchos cambios en uno

(grupo_a) $ git diff muchas_cosas master path/archivo/con/cambios/en/a.c path/archivo/con/cambios/en/a.h | git apply

El git apply nos deja aplicados los cambios de ese archivo pero no estan agregados vamos a a gregarlos de forma interactiva asi los vamos revisando. Aca se puede querer cortar el commit en dos partes o mas.

(grupo_a) $ git add -p (grupo_a) $ git commit -m "una parte de los cambios en a" (grupo_a) $ git add -p (grupo_a) $ git commit -m "otra parte de los cambios en a"

Opción Usar cherrypick

Abriendo gitk vas eligiendo los commits que queres mergear boton derecho cherry-pick this change.

Opción Combinar ambos metodos

Y lo mismo que antes pero ambas cosas.

Crear MR / PR

Ahora pushiamos y abrimos MR (grupo_a) # git push --set-upstream origin grupo_a

Vamos a gitlab y abrimos MR o con el cmdline creo que hay una forma

Continuar

Listo! Ahora es lo mismo con los otros grupos de cambios, $ git checkout master (master) $ git checkout -b grupo_b

y seguimos como antes

Terminar

Verificamos que no haya quedado nada perdido:

creamos un branch solo a partir de master para probar esto (master) $ git checkout -b terminar_rejunte # mergiamos todos los branches nuevos que hicimos (terminar_rejunte) $ git merge grupo_a (terminar_rejunte) $ git merge grupo_b (terminar_rejunte) $ git merge grupo_c ...

Comparamos contra nuestro branch original lleno de cosas para asegurarnos de no olvidarnos ningun cambio (terminar_rejunte) $ git diff terminar_rejunte muchas_cosas

Deberia dar una salida vacia. Si no da una salida vacia, agregar el cambio en el grupo de cambios adecuado o crear un nuevo grupo con lo que sale de esa salida.

Borramos este branch auxiliar (terminar_rejunte) $ git branch -D terminar_rejunte

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment