Parches de Git (git patch): Cheat Sheet
Los parches de Git son archivos de texto plano que representan las diferencias entre dos estados de tu código. Son útiles para compartir cambios específicos sin usar un repositorio completo o para aplicar correcciones. Este es un «Cheat Sheet» de referencia rápido para trabajar con ellos en tu Git.
1. ¿Qué es un Parche (Patch / Diff)?
- Un archivo de texto (
.patch
o.diff
) que contiene las instrucciones para transformar un conjunto de archivos de un estado a otro. - Muestra líneas añadidas (
+
), líneas eliminadas (-
), y el contexto alrededor. - Formato más común: «Unified Diff Format».
2. Generar Parches
Genera diferencias que pueden guardarse en un archivo.
- Diferencias del directorio de trabajo vs. la última versión commiteada (HEAD):
git diff > mi_cambio.patch
— - Diferencias de un archivo específico:
git diff mi_archivo.py > mi_cambio_en_archivo.patch
— - Diferencias entre dos commits específicos:
git diff <commit_anterior> <commit_actual> > cambios_entre_commits.patch
# Ejemplo: git diff HEAD~1 HEAD > ultimo_commit.patch
— - Diferencias de un commit específico (lo que introdujo ese commit):
git diff <commit_id>^! > solo_este_commit.patch
# Esto compara el commit con su padre directo.
— - Generar parches para varios commits (uno por commit, para emails):
git format-patch <commit_desde_donde>
# Genera un archivo .patch por cada commit desde <commit_desde_donde> hasta HEAD
# Ejemplo: git format-patch HEAD~3 (genera 3 parches para los últimos 3 commits)
—
Uso: Estos parches están pensados paragit am
.
3. Aplicar Parches
A. Usando git apply
(para parches de git diff
)
Ideal para aplicar cambios directos al árbol de trabajo (como si los hubieras escrito tú mismo), no crea commits.
- Previsualizar los cambios (¡MUY RECOMENDADO!):
git apply --stat mi_parche.patch
# Muestra un resumen de los archivos afectados
git apply --check mi_parche.patch
# Verifica si se puede aplicar limpiamente (sin errores, no hay salida)
— - Aplicar el parche:
git apply mi_parche.patch
— - Resolver problemas de rutas (
-pN
):
Si el parche tiene prefijos de ruta comoa/mi_archivo.py
ob/mi_archivo.py
:git apply -p1 mi_parche.patch
# -p1: Ignora el primer componente de la ruta (a/ o b/)
—
¿Cómo saber si necesitas-pN
?
Si--check
te da errores de «patch does not apply» o «file not found» y eldiff
empieza cona/
yb/
.
— - Manejo de conflictos (
--3way
):
Sigit apply
no puede aplicar el parche limpiamente (porque los archivos locales han cambiado), fallará.git apply --3way
puede intentar aplicar el parche y, si hay conflictos, te deja marcadores de conflicto en los archivos para que los resuelvas manualmente (como en un merge).git apply --3way mi_parche.patch
— - Después de aplicar
git apply
:- Los cambios quedan en tu directorio de trabajo (sin commitear ni en staging).
- Usa
git status
ygit diff
para revisar los cambios. - Haz
git add .
ygit commit -m "Aplicar mi_parche"
para guardarlos.
B. Usando git am
(para parches de git format-patch
)
Ideal para aplicar parches que representan commits completos (usualmente enviados por correo electrónico o generados con git format-patch
). git am
crea commits automáticamente.
- Aplicar un parche (
.patch
degit format-patch
):git am mi_commit_generado.patch
— - Manejo de conflictos con
git am
: Si hay conflictos,git am
se detendrá y te lo indicará.- Resolución: Edita los archivos para resolver los conflictos (busca marcadores
<<<<<<<
,=======
,>>>>>>>
). - Continuar:
git am --continue
- Abortar:
git am --abort
- Resolución: Edita los archivos para resolver los conflictos (busca marcadores
4. Problemas Comunes y Consejos
error: git diff header lacks filename information...
: El archivo.patch
contiene texto extra (ej. líneas de shell script al principio) que Git no espera. Edita el archivo y asegúrate de que empieza condiff --git
o--- a/
.- Conflictos: Si un parche no se aplica limpiamente, puede ser porque los archivos base han cambiado desde que se creó el parche. Necesitarás resolver los conflictos manualmente.
- Estado de tu repo: Siempre es buena práctica que tu repositorio esté limpio (
git status
no muestre cambios) antes de aplicar un parche, para evitar confusiones.
Informacion Adicional:
El héroe silencioso de la colaboración con Git: ¡Los parches! Por qué deberías empezar a usarlos hoy 🌟