git cherry-pick: cómo llevar un commit concreto a otra rama
git cherry-pick toma los cambios de un commit concreto y crea en la rama actual un commit nuevo con el mismo diff y mensaje, pero con otro hash. Cambia a la rama de destino y ejecuta git cherry-pick <hash>; si hay conflicto, corrige los archivos, haz git add y git cherry-pick --continue.
git cherry-pick lleva los cambios de un commit concreto a la rama actual sin fusionar la rama entera. Git calcula el diff del commit elegido respecto a su padre, lo aplica sobre tu HEAD y crea un commit nuevo: con el mismo mensaje y autor, pero con otro hash, porque tiene otro padre.
Caso típico: corregiste un bug en una rama de funcionalidad y la corrección se necesita con urgencia en la rama de release, donde esa funcionalidad aún no está lista. No puedes fusionar toda la rama, pero sí un solo commit.
Cómo pasar un commit a otra rama
Primero busca el hash del commit, después cambia a la rama a la que quieres llevarlo y ejecuta cherry-pick.
# 1. Buscamos el commit en la rama feature
git log --oneline feature
a1b2c3d Corregir división por cero en el cálculo del descuento
9f8e7d6 Añadir nueva pantalla de pago
# 2. Cambiamos a la rama de destino
git switch release-1.4
# 3. Traemos el commit
git cherry-pick a1b2c3d
[release-1.4 4e5f6a7] Corregir división por cero en el cálculo del descuento
Date: Mon Oct 5 14:12:03 2026 +0300
1 file changed, 3 insertions(+), 1 deletion(-)
Fíjate: el commit nuevo tiene el hash 4e5f6a7 y no a1b2c3d. Son dos objetos distintos con los mismos cambios. La rama de origen feature no se modifica.
En lugar del hash puedes pasar cualquier referencia a un commit: git cherry-pick feature toma el último commit de la rama feature y git cherry-pick feature~2, el tercero empezando por el final.
Cómo hacer cherry-pick de varios commits
Enumerándolos
Puedes pasar una lista de hashes: Git los aplicará en ese orden y creará el mismo número de commits nuevos.
git cherry-pick a1b2c3d 7c8d9e0 3f4a5b6
El orden importa: si el segundo commit depende del primero y los escribes al revés, tendrás un conflicto o código roto. Lo más seguro es indicarlos del más antiguo al más reciente.
Con un rango
Para commits consecutivos se usa la sintaxis de rango. Aquí hay una trampa en la que cae casi todo el mundo: A..B significa «commits alcanzables desde B pero no desde A», es decir, A no entra en el rango.
# Trae los commits POSTERIORES a A hasta B incluido
git cherry-pick A..B
# Trae A y todo hasta B incluido
git cherry-pick A^..B
Si necesitas traer todo lo que hay en la rama feature y no está en main, resulta cómodo git cherry-pick main..feature. Pero si son muchos commits, piénsalo: quizá lo que necesitas es rebase o merge, no cherry-pick.
Opciones útiles de git cherry-pick
| Opción | Qué hace | Cuándo usarla |
|---|---|---|
-x | Añade al mensaje la línea «(cherry picked from commit …)» | Al mover correcciones entre ramas públicas: se ve el origen |
-n, --no-commit | Aplica los cambios al índice y a la carpeta de trabajo sin hacer commit | Quieres juntar varios commits en uno o retocar antes del commit |
-e, --edit | Abre el editor para modificar el mensaje | Hay que adaptar el mensaje a la rama de destino |
-s, --signoff | Añade la línea Signed-off-by | Proyectos que exigen DCO |
-m 1 | Indica el padre «principal» de un commit de merge | Llevar un commit de merge |
--ff | Avanza la rama si HEAD es el padre del commit elegido | Pocas veces; evita crear un duplicado |
--allow-empty | Permite llevar commits que ya eran vacíos | Commits vacíos de servicio |
Para qué sirve -x
Dentro de seis meses alguien verá la corrección en la rama de release y querrá saber de dónde salió. La línea que añade -x responde directamente:
git cherry-pick -x a1b2c3d
git log -1
Corregir división por cero en el cálculo del descuento
(cherry picked from commit a1b2c3d4e5f60718293a4b5c6d7e8f9012345678)
Usa -x cuando el commit original ya esté publicado. Si lo traes de una rama local tuya que luego vas a borrar, la referencia no llevará a ninguna parte, así que ahí la opción sobra.
Juntar varios commits en uno: -n
git cherry-pick -n a1b2c3d 7c8d9e0
git status # los cambios de ambos commits están en el índice
git commit -m "Correcciones del cálculo del descuento"
Conflictos en cherry-pick y cómo resolverlos
Hay conflicto cuando los cambios del commit no encajan con el código actual: en la rama de destino esas mismas líneas ya son distintas. Git se detiene y te lo indica.
git cherry-pick a1b2c3d
Auto-merging src/discount.js
CONFLICT (content): Merge conflict in src/discount.js
error: could not apply a1b2c3d... Corregir división por cero en el cálculo del descuento
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".
A partir de aquí tienes tres caminos:
- Resolver y continuar. Abre el archivo, quita los marcadores
<<<<<<<,=======y>>>>>>>dejando la versión correcta, luegogit add src/discount.jsygit cherry-pick --continue. - Saltar el commit. Si estás trayendo una lista,
git cherry-pick --skipomite el commit problemático y pasa al siguiente. - Cancelarlo todo.
git cherry-pick --abortdevuelve la rama al estado anterior a la operación.
También existe git cherry-pick --quit: detiene la operación pero conserva los commits ya aplicados y el estado actual de los archivos. Es útil cuando has traído bien la mitad de la lista y quieres seguir a mano.
Si los conflictos se repiten una y otra vez (por ejemplo, llevas correcciones con regularidad a varias ramas de release), activa git config rerere.enabled true: Git recordará cómo resolviste el conflicto y aplicará la misma solución automáticamente la próxima vez.
Cómo hacer cherry-pick de un commit de merge
Un commit de merge tiene dos padres y Git no sabe respecto a cuál calcular el diff. Sin una pista obtendrás un error:
git cherry-pick 5d6e7f8
error: commit 5d6e7f8 is a merge but no -m option was given.
La opción -m 1 le dice: calcula los cambios respecto al primer padre, que normalmente es la rama en la que se fusionó. Así traes en un solo commit todo lo que aportó la rama fusionada.
git cherry-pick -m 1 5d6e7f8
Ten en cuenta que, después de esto, Git no considerará fusionada esa rama: en un merge futuro puede intentar aplicar los mismos cambios otra vez.
git cherry-pick y git apply: diferencias
git apply se menciona a menudo junto a cherry-pick porque ambos «aplican cambios». Pero trabajan con entradas distintas.
| git cherry-pick | git apply | |
|---|---|---|
| Origen | Un commit que existe en el repositorio | Un archivo de parche (diff) |
| Crea un commit | Sí (sin -n) | No, solo cambia archivos (con --index, también el índice) |
| Conserva autor y mensaje | Sí | No, el parche no los incluye |
| Conflictos | Fusión a tres bandas con marcadores | Por defecto simplemente falla; con --3way, marcadores |
| Requiere repositorio común | Sí, el commit debe estar disponible en local | No, el parche se puede enviar de cualquier forma |
Ejemplo de git apply cuando el commit no está en tu repositorio y un compañero te ha enviado el diff en un archivo:
# Lo que hace tu compañero
git diff main..fix-discount > fix.patch
# Tú lo compruebas y lo aplicas
git apply --check fix.patch # comprobar si el parche encaja
git apply fix.patch # aplicarlo a la carpeta de trabajo
git apply --3way fix.patch # si hay diferencias, con marcadores de conflicto
Si necesitas pasar un commit completo, con autor y mensaje, usa la pareja git format-patch y git am: el primero guarda los commits en archivos y el segundo crea commits a partir de ellos. En la práctica es un cherry-pick «por correo».
Por cierto, también se puede hacer cherry-pick desde otro repositorio: añádelo como remote, ejecuta git fetch y los commits estarán disponibles por su hash.
Cuándo cherry-pick es mala idea
Cherry-pick crea duplicados: el mismo cambio vive en el historial con dos hashes. En dosis pequeñas no pasa nada, pero hay escenarios en los que perjudica.
- Mover decenas de commits. Si estás trayendo casi toda la rama, eso es un rebase o un merge. Con cherry-pick tendrás un historial largo de duplicados y más conflictos.
- Movimientos en ambos sentidos. Llevaste un commit de feature a main y luego feature se fusiona en main. Git suele arreglárselas (los cambios coinciden), pero si alguien editó esas líneas después, tendrás un conflicto de la nada.
- Commits dependientes. El commit usa una función añadida dos commits antes. Cherry-pick solo trae ese commit y el código de la rama de destino no compilará. Comprueba siempre la compilación y los tests después de traer un commit.
Una buena práctica para los hotfixes es hacer la corrección directamente en la rama soportada más antigua y fusionarla «hacia arriba» en las más nuevas. Así cherry-pick solo hace falta como excepción.
Cómo deshacer un cherry-pick
Si la operación sigue en curso (conflicto), usa git cherry-pick --abort. Si el commit ya se creó y no se ha subido al servidor, elimínalo:
git reset --hard HEAD~1
Si el commit ya está en una rama compartida tras un push, no reescribas el historial: crea un commit inverso:
git revert 4e5f6a7
Y si hiciste reset y cambiaste de opinión, el commit perdido se encuentra con git reflog.
Cómo saber si un commit ya se ha traído
Como los hashes son distintos, el habitual git branch --contains no sirve. Git sabe comparar commits por el contenido de sus cambios (patch-id):
git cherry -v release-1.4 feature
- a1b2c3d Corregir división por cero en el cálculo del descuento
+ 9f8e7d6 Añadir nueva pantalla de pago
El signo menos indica que release-1.4 ya tiene un cambio equivalente; el más, que todavía no. Otra opción es git log --cherry-pick --oneline release-1.4...feature, que oculta los commits gemelos. Si usaste -x, basta con buscar por el mensaje: git log --grep="cherry picked from commit a1b2c3d".
Resumen
git cherry-pick es una herramienta de precisión: llevar un hotfix a una release, rescatar un commit útil de una rama abandonada o recolocar un commit hecho por error en otro sitio. Recuerda tres cosas: el commit nuevo recibe un hash nuevo, el rango A..B no incluye A y en ramas públicas conviene añadir -x. Si lo que necesitas no es un commit sino un diff en un archivo, usa git apply. Rebase, stash, cherry-pick y etiquetas se practican en detalle en el curso de Git.
Preguntas frecuentes
¿cherry-pick modifica la rama de origen?
No. El commit original sigue en su sitio y en la rama actual aparece una copia con un hash nuevo.
¿Se puede hacer cherry-pick de un commit de una rama remota?
Sí. Ejecuta git fetch; después el commit está disponible por su hash o como origin/nombre-rama y puedes pasarlo a git cherry-pick.
¿Por qué el commit tiene otro hash después del cherry-pick?
El hash depende del padre, de la fecha del commit y del contenido del árbol. La copia tiene otro padre y otra fecha de committer, así que el hash también cambia.
¿Se conserva el autor del commit con cherry-pick?
Sí, el autor y la fecha de autoría se toman del commit original; el committer pasas a ser tú, con la fecha actual.
¿Qué hago si cherry-pick dice que el commit está vacío?
Significa que esos cambios ya están en la rama. Sáltalo con git cherry-pick --skip o regístralo vacío con git commit --allow-empty.
Este tema se explica a fondo y con práctica en el curso «Git desde cero hasta desarrollador seguro».
Ir al curso