Guía

git cherry-pick: cómo llevar un commit concreto a otra rama

Actualizado: · Skillaria.Top

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ónQué haceCuándo usarla
-xAñade al mensaje la línea «(cherry picked from commit …)»Al mover correcciones entre ramas públicas: se ve el origen
-n, --no-commitAplica los cambios al índice y a la carpeta de trabajo sin hacer commitQuieres juntar varios commits en uno o retocar antes del commit
-e, --editAbre el editor para modificar el mensajeHay que adaptar el mensaje a la rama de destino
-s, --signoffAñade la línea Signed-off-byProyectos que exigen DCO
-m 1Indica el padre «principal» de un commit de mergeLlevar un commit de merge
--ffAvanza la rama si HEAD es el padre del commit elegidoPocas veces; evita crear un duplicado
--allow-emptyPermite llevar commits que ya eran vacíosCommits 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:

  1. Resolver y continuar. Abre el archivo, quita los marcadores <<<<<<<, ======= y >>>>>>> dejando la versión correcta, luego git add src/discount.js y git cherry-pick --continue.
  2. Saltar el commit. Si estás trayendo una lista, git cherry-pick --skip omite el commit problemático y pasa al siguiente.
  3. Cancelarlo todo. git cherry-pick --abort devuelve 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-pickgit apply
OrigenUn commit que existe en el repositorioUn archivo de parche (diff)
Crea un commitSí (sin -n)No, solo cambia archivos (con --index, también el índice)
Conserva autor y mensajeSíNo, el parche no los incluye
ConflictosFusión a tres bandas con marcadoresPor defecto simplemente falla; con --3way, marcadores
Requiere repositorio comúnSí, el commit debe estar disponible en localNo, 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.

Aprende este tema en vídeo

Este tema se explica a fondo y con práctica en el curso «Git desde cero hasta desarrollador seguro».

Ir al curso