Hero

Como generar un parche desde GIT

Marzo 20, 2014

enzo
GIT

Cuando trabajamos con git en múltiples branches es normal tener que aplicar código de un branch a otro, si bien es cierto que podriasmos hacer git merge esto no siempre es posible porque talvez no tengamos derechos de escritura en ambos branches.

  1. Creación del parche.

Además quizás no necesitamos hacer un merge completo sino aplicar un commit en especifico, si tenemos derecho de escritura en ambos branches podríamos hacer uso del git cherry-pick como se muestra a continuación.

git checkout master
git cherry-pick b0429c202bafde0bae7439d4ce70480b1b5604b3

En el ejemplo anterior se utiliza la llave SHA-1 que se le asigna a cada commit.

Sin embargo esto no soluciona el problema de que no tengamos derechos de escritura en el branch de destino. Para esto creamos un parche utilizando el comando format-patch como se puede apreciar en el siguiente comando:

git format-patch -1 e99b2cd8bafc5efc9d9b353d6fb5530e61a8c3ae

0001-Lmessages-theming.patch

En anterior comando tomara todo los cambios y generara un archivo cuyo nombre sera el comentario del commit.

Ahora bien si tenemos 99 commits y deseamos aplicar todo a master tenemos dos opciones.

1.1 Crear un patch por cada commit.

git format-patch master

0001-site_name-variable.patch
0002-wizard-and-preview.patch

Se aumentara el numero de consecutivo desde 0001 hasta llegar al ultimo en nuestro ejemplo a 0099-message-commit.patch

2.1 Crear un solo patch para todos los commits

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

De esta forma en el archivo fix_master estarían todos los cambios.

  1. Aplicar el parche.

Con el parche en nuestras manos y posicionados en el branch que deseamos aplicar el parche por ejemplo master debemos hacer algunas revisiones.

Primero verificar que archivos se van a modificar, para esto debemos obtener alguna estadísticas como se muestra a continuación.

git apply --stat fix_master.patch
 .../sites/default/themes/fancy/css/fancy.css       |   14 +++++++++
 .../sites/default/themes/fancy/js/main.js    |   31 ++++++++++++++++++++
 .../sites/default/themes/fancy/sass/fancy.sass     |   14 +++++++++
 .../sites/default/themes/fancy/templates/page.tpl.php     |    2 +
 4 files changed, 60 insertions(+), 1 deletion(-)

Si estamos seguros de que los cambios son los deseados debemos verificar que todos los cambios se aplicaran correctamente, esto porque quizás entre que se creo el parche y el estado actual las lineas de referencia en el archivo de destino utilizadas para aplicar el cambio hayan cambiado, esto lo hacemos con el siguiente comando.

git apply --check 0001-LM-messages-theming.patch
error: patch failed: .../sites/default/themes/fancy/template.php:4

Si la salida en vacía significa que se aplicara sin problemas y si es similar al ejemplo anterior nos indicara donde esta el problema, para lo cual tendremos dos opciones generar de nuevo el parche o ajustar el parche para remover las lineas erróneas.

Espero que haya sido de su agrado

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.