14/02/2021
En el vasto universo del control de versiones con Git, los flujos de trabajo basados en pull requests a través de plataformas como GitHub o GitLab se han convertido en el estándar de la industria. Sin embargo, antes de que esta metodología dominara el panorama, existía una forma más directa y descentralizada de compartir código: los parches. Un parche de Git no es más que un archivo de texto que contiene un conjunto de diferencias o cambios en el código, junto con los metadatos del commit asociado. Aunque pueda parecer una reliquia del pasado, dominar la creación y aplicación de parches es una habilidad increíblemente valiosa que te puede diferenciar como desarrollador, especialmente cuando colaboras en proyectos que aún siguen este flujo, como el propio Kernel de Linux.

Crear un parche es, en esencia, empaquetar tu trabajo para enviárselo a otra persona. Aplicarlo es el proceso inverso: tomar el trabajo de alguien e integrarlo en tu repositorio local. En esta guía completa, exploraremos a fondo cómo manejar parches utilizando la línea de comandos (CLI), desglosando los comandos, sus opciones y los escenarios más comunes para que puedas integrar esta técnica en tu repertorio de habilidades con Git.
¿Por Qué Siguen Siendo Relevantes los Parches en Git?
A pesar de la popularidad de los pull requests, los parches conservan su utilidad en varios escenarios específicos. Comprender cuándo y por qué usarlos te permitirá elegir la herramienta adecuada para cada situación.
- Colaboración Descentralizada: No todos los proyectos se alojan en plataformas centralizadas. Algunos flujos de trabajo, especialmente en comunidades de código abierto de larga data, se basan en listas de correo. Los desarrolladores envían sus parches por correo electrónico, donde son discutidos y revisados por los mantenedores antes de ser aplicados.
- Seguridad y Revisión Exhaustiva: Proyectos de gran escala como el Kernel de Linux o el propio Git utilizan parches para dar a los mantenedores un control granular sobre cada cambio. Les permite revisar meticulosamente el código antes de integrarlo en la base principal, añadiendo una capa adicional de seguridad y calidad.
- Compartir Cambios Rápidos: ¿Necesitas enviar una corrección rápida a un colega sin la sobrecarga de crear una nueva rama, hacer push y abrir un pull request? Generar un parche con tus cambios locales (incluso sin haber hecho commit) y enviárselo directamente puede ser mucho más rápido y eficiente.
- Trabajo Offline: Si te encuentras en un entorno con conectividad limitada, puedes generar parches de tus commits y guardarlos para enviarlos más tarde, sin depender de una conexión constante a un repositorio remoto.
Creando Parches: El Arte de Empaquetar tu Código
El comando principal para generar parches que conservan la información del commit es git format-patch. Sin embargo, para cambios no confirmados, usaremos el versátil git diff. Veamos cada caso en detalle.
Crear un Parche desde un Único Commit
Este es el caso de uso más común. Has finalizado una tarea en un solo commit y quieres compartirlo. Primero, necesitas identificar el commit. Puedes hacerlo con el comando git log para ver el historial.

Una vez que tengas el hash SHA del commit (o una referencia como HEAD), ejecuta el siguiente comando:
git format-patch -1 <commit_SHA>
El argumento -1 le indica a Git que solo quieres crear un parche para un único commit. Git generará un archivo con un nombre como 0001-Mensaje-del-commit.patch. Este archivo contiene no solo el diff del código, sino también el autor, la fecha y el mensaje del commit original, información esencial para una correcta atribución.
Crear Parches para Múltiples Commits
Si tu funcionalidad se extiende a lo largo de varios commits, también puedes generar un parche para cada uno de ellos. Para ello, debes especificar un rango de commits. Por ejemplo, para crear parches para los últimos tres commits:
git format-patch HEAD~3..HEAD
Este comando creará tres archivos de parche separados: 0001-....patch, 0002-....patch y 0003-....patch, uno por cada commit en el rango especificado. Esto permite al receptor aplicar los cambios de forma incremental, tal como los creaste.
Crear un Parche para Cambios No Confirmados (Uncommitted)
A veces, simplemente quieres compartir cambios que tienes en tu directorio de trabajo pero que aún no has confirmado en un commit. Para esto, el comando git diff es tu mejor aliado.
git diff > mis-cambios.patch
Este comando captura todas las diferencias entre tu directorio de trabajo y el último commit (o el área de staging) y las redirige a un archivo llamado mis-cambios.patch. Es importante destacar que este tipo de parche no contiene metadatos del autor o del commit, ya que no existe ninguno. Es simplemente un diff puro, ideal para correcciones rápidas o sugerencias.
Aplicando Parches: Integrando el Trabajo de Otros
Una vez que recibes un archivo .patch, tienes dos comandos principales para aplicarlo: git apply y git am. Aunque suenan similares, su comportamiento y propósito son muy diferentes.

El Método Rápido y Seguro: `git apply`
El comando git apply toma un archivo de parche y aplica los cambios directamente a los archivos en tu directorio de trabajo. No crea un commit; simplemente modifica los archivos como si hubieras escrito los cambios tú mismo. Es el equivalente a aplicar un parche generado con git diff.
Antes de aplicar cualquier cambio, es una buena práctica previsualizar lo que hará el parche. Puedes hacerlo con dos opciones muy útiles:
git apply --stat mi-parche.patch: Muestra un resumen de los archivos que se crearán, modificarán o eliminarán.git apply --check mi-parche.patch: Realiza una ejecución de prueba (dry run). No aplica ningún cambio, pero te avisará si hay conflictos o problemas. Es una comprobación de seguridad fundamental.
Si todo parece correcto, aplica el parche:
git apply mi-parche.patch
Después de ejecutar este comando, los cambios estarán en tu directorio de trabajo como modificaciones sin confirmar. Deberás añadirlos al staging y crear un commit manualmente:
git add .
git commit -m "Aplicando parche con las mejoras X"
El Método Completo y Fiel al Original: `git am`
El comando git am (apply from mailbox) está diseñado específicamente para aplicar parches creados con git format-patch. Su gran ventaja es que no solo aplica los cambios de código, sino que también lee los metadatos del parche (autor, fecha, mensaje) y crea un nuevo commit en tu repositorio local que es una copia exacta del commit original.
git am < 0001-nombre-del-parche.patch
Este comando es increíblemente poderoso porque mantiene la integridad y la historia del proyecto. Si recibes una serie de parches, git am los aplicará en orden, recreando la secuencia de commits tal como la hizo el desarrollador original.
Manejo de Conflictos con `git am`
A veces, el parche que intentas aplicar puede entrar en conflicto con tus cambios locales. En este caso, git am se detendrá y te notificará. Tu tarea es abrir los archivos conflictivos (marcados por Git con `<<<<<<<`, `=======`, `>>>>>>>`), resolver las diferencias manualmente, y luego continuar el proceso. Una vez resueltos los conflictos, añade los archivos modificados y ejecuta:
git am --continue
Si decides que no quieres aplicar el parche después de todo, puedes abortar la operación con git am --abort, lo que devolverá tu repositorio al estado en que se encontraba antes de intentar aplicar el parche.

Tabla Comparativa: `git apply` vs. `git am`
| Característica | git apply | git am |
|---|---|---|
| Origen del Parche | Generalmente git diff | Diseñado para git format-patch |
| Resultado Final | Modifica archivos en el directorio de trabajo (sin commit) | Aplica el parche y crea un nuevo commit |
| Metadatos del Commit | No preserva metadatos del commit original | Preserva autor, mensaje y fecha del commit original |
| Manejo de Conflictos | Falla si hay conflictos (se puede usar --reject para crear archivos .rej) | Pausa el proceso, permitiendo resolver conflictos y continuar con --continue |
| Caso de Uso Principal | Aplicar cambios rápidos o previsualizar un parche sin comprometerse | Integrar contribuciones de otros desarrolladores manteniendo un historial limpio y preciso |
Preguntas Frecuentes (FAQ)
¿Cuál es la diferencia clave entre `git apply` y `git am`?
La diferencia fundamental es que git apply solo modifica los archivos, dejando que tú hagas el commit, mientras que git am aplica los cambios y crea automáticamente un commit utilizando la información contenida en el archivo de parche (autor, mensaje, etc.). Usa git apply para cambios simples y git am para integrar commits completos de otros colaboradores.
¿Puedo crear un parche para cambios que ni siquiera están en el área de "staging"?
¡Sí! El comando git diff > mi_parche.patch por defecto compara tu directorio de trabajo actual con el índice (el área de staging). Por lo tanto, capturará todos los cambios que has hecho en los archivos rastreados, independientemente de si has usado git add o no.
¿Los parches son una técnica obsoleta debido a los Pull Requests?
No, no son obsoletos. Son una herramienta diferente para un flujo de trabajo diferente. Mientras que los Pull Requests son excelentes para la colaboración en plataformas centralizadas, los parches siguen siendo la columna vertebral de proyectos masivos y descentralizados. Conocer ambos te convierte en un desarrollador mucho más versátil y preparado para cualquier tipo de entorno de colaboración.
¿Qué significa la opción `--signoff` en `git am`?
La opción git am --signoff añade una línea "Signed-off-by:" al final del mensaje del commit con tu nombre y correo electrónico. Esto se usa en muchos proyectos de código abierto como una declaración de que tienes el derecho de enviar el cambio como una contribución y que aceptas los términos de licencia del proyecto. Es una forma de certificar el origen del cambio.
Conclusión
Dominar la creación y aplicación de parches en Git es como aprender un nuevo dialecto en el idioma del control de versiones. Te abre las puertas a una forma de colaboración más clásica pero increíblemente robusta y te proporciona herramientas para compartir código de manera rápida y eficiente en situaciones donde un pull request sería excesivo. Desde enviar una solución rápida a un colega hasta contribuir a un proyecto de código abierto legendario, los comandos git format-patch, git diff, git apply y git am son adiciones invaluables a tu conjunto de herramientas. La próxima vez que necesites compartir tus cambios, considera si un parche podría ser la solución más elegante y directa. ¡Tu versatilidad como desarrollador te lo agradecerá!
Si quieres conocer otros artículos parecidos a Guía Completa para Crear y Aplicar Parches en Git puedes visitar la categoría Juegos.
