{"id":300,"date":"2026-06-24T12:05:30","date_gmt":"2026-06-24T19:05:30","guid":{"rendered":"https:\/\/www.mariatech.com.mx\/blog\/?p=300"},"modified":"2026-06-24T12:06:22","modified_gmt":"2026-06-24T19:06:22","slug":"corregir-una-rama-creada-desde-la-base-incorrecta-con-git-cherry-pick","status":"publish","type":"post","link":"https:\/\/www.mariatech.com.mx\/blog\/git\/corregir-una-rama-creada-desde-la-base-incorrecta-con-git-cherry-pick\/","title":{"rendered":"Corregir una rama creada desde la base incorrecta con git cherry-pick"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En un flujo de trabajo con Git es com\u00fan crear ramas nuevas para desarrollar funcionalidades espec\u00edficas. Esto permite mantener el c\u00f3digo organizado, probar cambios sin afectar la rama principal y preparar Pull Requests m\u00e1s claros.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sin embargo, tambi\u00e9n puede pasar que una rama se cree desde una base incorrecta. Por ejemplo, en lugar de crear una nueva rama desde <code>main<\/code>, se crea desde otra rama de desarrollo que todav\u00eda no est\u00e1 lista para integrarse. Cuando esto ocurre, el Pull Request puede mostrar muchos commits adicionales que no pertenecen realmente al cambio que queremos subir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El problema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Supongamos que tenemos una rama principal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n existe una rama de desarrollo para una integraci\u00f3n grande:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>feature\/integracion-api<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s se crea una nueva rama para una funcionalidad m\u00e1s peque\u00f1a, por ejemplo el registro del costo de env\u00edo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>feature\/integracion-envios<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">El detalle es que esta \u00faltima rama fue creada accidentalmente desde <code>feature\/integracion-api<\/code> y no desde <code>main<\/code>. Entonces, al intentar crear un Pull Request hacia <code>main<\/code>, GitHub muestra que se van a aplicar muchos commits adicionales.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En ese punto la se\u00f1al de alerta es clara: si la funcionalidad era peque\u00f1a, pero el Pull Request muestra demasiados commits o archivos que no corresponden, no conviene hacer el merge todav\u00eda.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por qu\u00e9 no era buena idea hacer el merge directo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si se hac\u00eda el merge directo de <code>feature\/integracion-envios<\/code> hacia <code>main<\/code>, tambi\u00e9n se pod\u00edan integrar cambios incompletos de la rama <code>feature\/integracion-api<\/code>. Esto habr\u00eda mezclado funcionalidades distintas y pudo provocar errores en producci\u00f3n o en el ambiente de pruebas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El objetivo era integrar \u00fanicamente los commits relacionados con el registro del costo de env\u00edo, sin arrastrar el trabajo de otra rama.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La soluci\u00f3n: crear una rama limpia desde main<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La soluci\u00f3n fue crear una nueva rama partiendo correctamente desde <code>main<\/code> y despu\u00e9s aplicar \u00fanicamente los commits necesarios usando <code>git cherry-pick<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El comando <code>git cherry-pick<\/code> permite tomar uno o varios commits espec\u00edficos de otra rama y aplicarlos sobre la rama actual. Esto resulta \u00fatil cuando queremos rescatar cambios puntuales sin mezclar todo el historial de la rama original.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Actualizar la informaci\u00f3n del repositorio<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Primero se actualiza la informaci\u00f3n del repositorio remoto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git fetch origin<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este comando descarga las referencias m\u00e1s recientes de las ramas remotas, sin modificar directamente el c\u00f3digo de la rama actual.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Cambiar a main y actualizarla<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s se cambia a la rama principal y se actualiza con los \u00faltimos cambios disponibles:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout main\ngit pull origin main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto asegura que la nueva rama limpia se cree desde la versi\u00f3n m\u00e1s reciente de <code>main<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Crear una nueva rama limpia<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Con <code>main<\/code> actualizada, se crea una nueva rama limpia para la funcionalidad:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout -b feature\/integracion-envios-clean<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esta nueva rama ya no tendr\u00e1 como base la rama de integraci\u00f3n grande, sino directamente <code>main<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Identificar los commits correctos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El siguiente paso es identificar los commits que realmente corresponden a la funcionalidad de env\u00edos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git log --oneline origin\/feature\/integracion-api..origin\/feature\/integracion-envios<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este comando ayuda a visualizar los commits que existen en la rama de env\u00edos, pero que no forman parte de la rama base desde la que fue creada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El resultado puede ser algo como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>abc1234 Agrega campo de costo de env\u00edo al pedido\ndef5678 Ajusta c\u00e1lculo total incluyendo env\u00edo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo, esos dos commits ser\u00edan los \u00fanicos que realmente se necesitan aplicar en la rama limpia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Aplicar los commits con cherry-pick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez identificados los commits correctos, se aplican sobre la rama limpia:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git cherry-pick abc1234 def5678<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Con esto, Git toma los cambios introducidos por esos commits y los aplica sobre la rama actual, generando nuevos commits con esos mismos cambios.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si durante el proceso aparecen conflictos, se deben resolver manualmente, agregar los archivos corregidos y continuar el cherry-pick:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git add .\ngit cherry-pick --continue<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si fuera necesario cancelar el proceso, se puede usar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git cherry-pick --abort<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">6. Revisar los cambios antes de subir la rama<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de subir la nueva rama, se revisa el estado del repositorio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git status<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n es recomendable revisar qu\u00e9 archivos quedaron modificados:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git diff --name-only main...feature\/integracion-envios-clean<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La idea es confirmar que la rama limpia solo contiene archivos relacionados con la funcionalidad que se quiere integrar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Subir la rama limpia al repositorio remoto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez revisado todo, se sube la nueva rama a GitHub:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git push -u origin feature\/integracion-envios-clean<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de esto, ya es posible crear un nuevo Pull Request desde la rama limpia hacia <code>main<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Crear el Pull Request correcto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En GitHub, el nuevo Pull Request debe quedar configurado de esta forma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>base: main\ncompare: feature\/integracion-envios-clean<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora el Pull Request mostrar\u00e1 \u00fanicamente los commits necesarios y los archivos relacionados con el registro del costo de env\u00edo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esto permite hacer una revisi\u00f3n m\u00e1s clara, evitar mezclar funcionalidades y mantener la rama <code>main<\/code> limpia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Flujo completo de comandos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El flujo completo quedar\u00eda de la siguiente manera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git fetch origin\n\ngit checkout main\ngit pull origin main\n\ngit checkout -b feature\/integracion-envios-clean\n\ngit log --oneline origin\/feature\/integracion-api..origin\/feature\/integracion-envios\n\ngit cherry-pick abc1234 def5678\n\ngit status\n\ngit diff --name-only main...feature\/integracion-envios-clean\n\ngit push -u origin feature\/integracion-envios-clean<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Buenas pr\u00e1cticas para evitar este problema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de empezar una nueva funcionalidad, es recomendable seguir este flujo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout main\ngit pull origin main\ngit checkout -b feature\/nueva-funcionalidad<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n conviene revisar la rama actual antes de crear una nueva:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch --show-current<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Con este peque\u00f1o h\u00e1bito se evitan muchos problemas al momento de crear Pull Requests.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando una rama se crea desde la base incorrecta, no siempre es necesario rehacer todo el trabajo. Si los cambios est\u00e1n organizados en commits claros, podemos crear una rama limpia desde <code>main<\/code> y aplicar \u00fanicamente los commits necesarios con <code>git cherry-pick<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este caso, la soluci\u00f3n fue evitar el merge directo, crear una nueva rama limpia, aplicar los commits correctos y generar un Pull Request m\u00e1s claro y seguro. Esto permiti\u00f3 integrar la funcionalidad sin arrastrar cambios de otra rama que todav\u00eda no estaba lista.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Algunas veces por equivocaci\u00f3n creamos ramas desde otra que no es main y cuando queremos hacer el pull request tenemos commits que no deber\u00edan aplicarse, en este art\u00edculo veremos como resolverlo de una forma sencilla&#8230;<\/p>\n","protected":false},"author":1,"featured_media":301,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[],"class_list":["post-300","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-git"],"_links":{"self":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts\/300","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=300"}],"version-history":[{"count":0,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts\/300\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/media\/301"}],"wp:attachment":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=300"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=300"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}