Para compartir cambios entre repositorios sin utilizar un servidor remoto, Git permite exportar commits como archivos de parche. La herramienta principle para esta tarea es format-patch. Este comando crea archivos .patch que contienen tanto los cambios en el código como los metadatos del commit (autor, fecha, mensaje).
Generación de parches
El comando git format-patch permite seleccionar commits específicos o rangos para exportarlos. A continuación, se muestran las variaciones más útiles:
# Generar un parche para el último commit
git format-patch HEAD~1
# Generar parches para los últimos tres commits
git format-patch HEAD~3
# Crear parches para un rango específico de commits (excluyendo el commit inicial)
git format-patch a1b2c3d..e4f5g6h
# Generar el parche de un commit específico usando su hash
git format-patch -1 a1b2c3d
# Exportar todos los commits desde el inicio del historial hasta un punto dado
git format-patch --root e4f5g6h
Aplicación de parches: git am vs git apply
Una vez generados los archivos, existen dos métodos principales para integrarlos en otra rama o repositorio:
- git am (apply mailbox): Aplica el parche y crea un nuevo commmit conservando la información original del autor y el mensaje. Es ideal para mantener el historial intacto. Los cambios se integran directamente en el historial de commits.
- git apply: Modifica los archiovs en el directorio de trabajo. Por defecto, no crea un commit ni preserva los metadatos del autor original. Los archivos modificados quedan listos para ser revisados y confirmados manualmente mediante
git addygit commit.
Resolución de errores comunes
Si una operación con git am se interrumpe debido a conflictos de fusión, Git puede bloquear futuras aplicaciones mostrando un error similar al siguiente:
fatal: previous rebase directory .git/rebase-apply still exists but mbox given.
Esto ocurre porque quedó un estado de aplicación inconcluso en el directorio .git/rebase-apply. Para solucionarlo y limpiar el estado, se debe abortar el proceso actual:
git am --abort
Comandos para aplicar y gestionar parches
El siguiente bloque detalla el flujo de trabajo para verificar, aplicar y resolver conflictos al integrar parches:
# Verificar el contenido y las estadísticas del parche sin aplicarlo
git apply --stat feature-update.patch
# Comprobar si el parche se puede aplicar limpiamente (sin conflictos)
git apply --check feature-update.patch
# Aplicar el parche conservando los metadatos y añadiendo una firma de revisión (Signed-off-by)
git am --signoff feature-update.patch
# Aplicar múltiples parches desde un directorio en orden alfabético
git am ~/patches/feature-set/*.patch
# Continuar con la aplicación después de resolver conflictos manualmente y añadir los cambios al staging
git am --continue