En un flujo de trabajo con Git es común crear ramas nuevas para desarrollar funcionalidades específicas. Esto permite mantener el código organizado, probar cambios sin afectar la rama principal y preparar Pull Requests más claros.
Sin embargo, también puede pasar que una rama se cree desde una base incorrecta. Por ejemplo, en lugar de crear una nueva rama desde main, se crea desde otra rama de desarrollo que todavía no está lista para integrarse. Cuando esto ocurre, el Pull Request puede mostrar muchos commits adicionales que no pertenecen realmente al cambio que queremos subir.
El problema
Supongamos que tenemos una rama principal:
main
También existe una rama de desarrollo para una integración grande:
feature/integracion-api
Después se crea una nueva rama para una funcionalidad más pequeña, por ejemplo el registro del costo de envío:
feature/integracion-envios
El detalle es que esta última rama fue creada accidentalmente desde feature/integracion-api y no desde main. Entonces, al intentar crear un Pull Request hacia main, GitHub muestra que se van a aplicar muchos commits adicionales.
En ese punto la señal de alerta es clara: si la funcionalidad era pequeña, pero el Pull Request muestra demasiados commits o archivos que no corresponden, no conviene hacer el merge todavía.
Por qué no era buena idea hacer el merge directo
Si se hacía el merge directo de feature/integracion-envios hacia main, también se podían integrar cambios incompletos de la rama feature/integracion-api. Esto habría mezclado funcionalidades distintas y pudo provocar errores en producción o en el ambiente de pruebas.
El objetivo era integrar únicamente los commits relacionados con el registro del costo de envío, sin arrastrar el trabajo de otra rama.
La solución: crear una rama limpia desde main
La solución fue crear una nueva rama partiendo correctamente desde main y después aplicar únicamente los commits necesarios usando git cherry-pick.
El comando git cherry-pick permite tomar uno o varios commits específicos de otra rama y aplicarlos sobre la rama actual. Esto resulta útil cuando queremos rescatar cambios puntuales sin mezclar todo el historial de la rama original.
1. Actualizar la información del repositorio
Primero se actualiza la información del repositorio remoto:
git fetch origin
Este comando descarga las referencias más recientes de las ramas remotas, sin modificar directamente el código de la rama actual.
2. Cambiar a main y actualizarla
Después se cambia a la rama principal y se actualiza con los últimos cambios disponibles:
git checkout main
git pull origin main
Esto asegura que la nueva rama limpia se cree desde la versión más reciente de main.
3. Crear una nueva rama limpia
Con main actualizada, se crea una nueva rama limpia para la funcionalidad:
git checkout -b feature/integracion-envios-clean
Esta nueva rama ya no tendrá como base la rama de integración grande, sino directamente main.
4. Identificar los commits correctos
El siguiente paso es identificar los commits que realmente corresponden a la funcionalidad de envíos.
git log --oneline origin/feature/integracion-api..origin/feature/integracion-envios
Este comando ayuda a visualizar los commits que existen en la rama de envíos, pero que no forman parte de la rama base desde la que fue creada.
El resultado puede ser algo como:
abc1234 Agrega campo de costo de envío al pedido
def5678 Ajusta cálculo total incluyendo envío
En este ejemplo, esos dos commits serían los únicos que realmente se necesitan aplicar en la rama limpia.
5. Aplicar los commits con cherry-pick
Una vez identificados los commits correctos, se aplican sobre la rama limpia:
git cherry-pick abc1234 def5678
Con esto, Git toma los cambios introducidos por esos commits y los aplica sobre la rama actual, generando nuevos commits con esos mismos cambios.
Si durante el proceso aparecen conflictos, se deben resolver manualmente, agregar los archivos corregidos y continuar el cherry-pick:
git add .
git cherry-pick --continue
Si fuera necesario cancelar el proceso, se puede usar:
git cherry-pick --abort
6. Revisar los cambios antes de subir la rama
Antes de subir la nueva rama, se revisa el estado del repositorio:
git status
También es recomendable revisar qué archivos quedaron modificados:
git diff --name-only main...feature/integracion-envios-clean
La idea es confirmar que la rama limpia solo contiene archivos relacionados con la funcionalidad que se quiere integrar.
7. Subir la rama limpia al repositorio remoto
Una vez revisado todo, se sube la nueva rama a GitHub:
git push -u origin feature/integracion-envios-clean
Después de esto, ya es posible crear un nuevo Pull Request desde la rama limpia hacia main.
8. Crear el Pull Request correcto
En GitHub, el nuevo Pull Request debe quedar configurado de esta forma:
base: main
compare: feature/integracion-envios-clean
Ahora el Pull Request mostrará únicamente los commits necesarios y los archivos relacionados con el registro del costo de envío.
Esto permite hacer una revisión más clara, evitar mezclar funcionalidades y mantener la rama main limpia.
Flujo completo de comandos
El flujo completo quedaría de la siguiente manera:
git fetch origin
git checkout main
git pull origin main
git checkout -b feature/integracion-envios-clean
git log --oneline origin/feature/integracion-api..origin/feature/integracion-envios
git cherry-pick abc1234 def5678
git status
git diff --name-only main...feature/integracion-envios-clean
git push -u origin feature/integracion-envios-clean
Buenas prácticas para evitar este problema
Antes de empezar una nueva funcionalidad, es recomendable seguir este flujo:
git checkout main
git pull origin main
git checkout -b feature/nueva-funcionalidad
También conviene revisar la rama actual antes de crear una nueva:
git branch --show-current
Con este pequeño hábito se evitan muchos problemas al momento de crear Pull Requests.
Conclusión
Cuando una rama se crea desde la base incorrecta, no siempre es necesario rehacer todo el trabajo. Si los cambios están organizados en commits claros, podemos crear una rama limpia desde main y aplicar únicamente los commits necesarios con git cherry-pick.
En este caso, la solución fue evitar el merge directo, crear una nueva rama limpia, aplicar los commits correctos y generar un Pull Request más claro y seguro. Esto permitió integrar la funcionalidad sin arrastrar cambios de otra rama que todavía no estaba lista.
Este tipo de situaciones son comunes en proyectos reales, y aprender a resolverlas correctamente ayuda a mantener un historial limpio, reducir errores y mejorar el flujo de trabajo en equipo.







Deja un comentario