Trabajando con parches, mejorando proyectos usando patch

Si necesitamos hacer un cambio en un proyecto que está dentro nuestro directorio vendor, ¿como hacer ese cambio de manera ágil y luego poder “transplantarlo/integrarlo”.

Todos tenemos dependencias en nuestros proyectos, seguro que os ha pasado, que estamos desarrollando una funcionalidad en un proyecto A y para poder completarla necesitamos “tocar” un proyecto B que es una dependencia de A. Tenemos al proyecto B dentro de nuestra carpeta vendor y tenemos que modificarlo, ¿cómo hacemos esto de manera ágil?

La manera más ortodoxa de crear una funcionalidad en el proyecto B que necesitamos para terminar una funcionalidad en A sería: abrir el proyecto B, crear una rama, realizar dichos cambios y testearlos, integrar la rama en master, subir de versión el proyecto B. Ir al proyecto A, crear una rama, modificar el composer, actualizarlo y empezar con la funcionalidad de B. Como veis, es sencillo pero un poco largo, es más puede que nos ea una funcionalidad, sino que tenemos que solucionar un bug importante, ¿como lo hacemos de manera más ágil? Creando un patch

Seguro que existen muchas maneras de hacerlo pero hoy vamos a explicar cómo hacer un patch.

Generando un patch

Supongamos que estamos en el proyecto A, lo que hacemos es crear los cambios necesarios en el proyecto B (proyecto que es una dependencia de A y se encuentra en /vendor) para terminar la funcionalidad de A, entonces cuando ya tengamos toda la funcionalidad creada en el proyecto B abrimos un terminal y vamos hacia la raiz de esa dependencia y…

git diff > /tmp/patch.diff

Con esto creamos un patch de unos cambios no commiteados. Es decir obtenemos un archivo que incluso podemos enviar por email.

Si no nos gusta la consola, también podemos hacerlo utilizando PHPStorm

Creando un patch

Aplicando un patch

Ahora podemos ir al proyecto B tranquilamente, crear una rama o lo que queramos y aplicar los cambios. Para ello solo tenemos que escribir en un terminal:

git apply /tmp/patch.diff

Esto modificara los archivos de nuestro directorio de trabajo, con esto ya hemos “traspasado” los cambios que estaban en nuestra dependencia del proyecto A directamente al proyecto B.

Si no nos gusta la consola también podemos aplicarlo utilizando PHPStorm

Aplicando un patch

De la misma manera también podemos hacer patch de commits. Imaginemos que creamos una rama en nuestro proyecto, y tenemos terminada una funcionalidad que necesita un compañero. Nuestra tarea no está terminada, pero sí lo que necesita el compañero.
Una opción sería que mi compañero mergease mi rama en su tarea, pero eso implicaría que se llevaría consigo “cambios no terminados”.

$ git clone https://github.com/jeslopcru/VarnishAdmin.git
$ cd VarnishAdmin
$ git checkout -b fix_empty_url

$ git log --pretty=oneline -3
* ce30d1f - (fix_empty_url) Added check when URL is bad format (7 minutes ago)
* 5998b80 - Added test for check when URL is bad format (12 minutes ago)
* aecb8cb - (REL-0.5.0, origin/master, origin/HEAD, master) Prepare release 0.5.0 (4 months ago)

En el escenario anterior podemos ver la situación, si un compañero necesitase mis cambios hasta este momento podría hacer un patch para enviarselos.

git format-patch master --stdout > fix_empty_url.patch

Ahora mi compañero con el fichero fix_empty_url.patch puede integrar mis cambios en su trabajo.

Revisando un patch

Hay veces que a la hora de aplicar un cambio estamos con nuestro espacio de trabajo sucio y queremos ver como afectaría el patch antes de aplicarlo, para esto tenemos:

$ git apply --stat fix_empty_url.patch
$ git apply --check fix_empty_url.patch

El primer comando nos muestra una estadística antes de aplicar el parche, el otro chequea que todo este correcto.

Espero que os haya servido este pequeño tutorial y espero que a mi “yo del futuro” también le sirva 😉

Por cierto, una de las mejores maneras de aprender git es haciendo los retos de github 😉
https://try.github.io/levels/1/challenges/1

Anuncios

Comenta la entrada

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s