{"id":4211,"date":"2025-06-13T18:52:19","date_gmt":"2025-06-13T16:52:19","guid":{"rendered":"https:\/\/davidperezgar.com\/?p=4211"},"modified":"2025-06-14T10:20:18","modified_gmt":"2025-06-14T08:20:18","slug":"como-limpiar-ramas-locales-que-ya-no-existen-en-el-repositorio-remoto-con-un-solo-comando","status":"publish","type":"post","link":"https:\/\/davidperezgar.com\/es\/como-limpiar-ramas-locales-que-ya-no-existen-en-el-repositorio-remoto-con-un-solo-comando\/","title":{"rendered":"C\u00f3mo limpiar ramas locales que ya no existen en el repositorio remoto con un solo comando"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Cuando trabajamos en diferentes proyectos y adem\u00e1s usamos la estrategia que siempre recomiendo <a href=\"https:\/\/www.hostinger.com\/blog\/trunk-based-development-workflow-in-wordpress\" target=\"_blank\" rel=\"noopener\">Trunk Based development<\/a>, es habitual que creemos muchas ramas temporales. Algunas se eliminan del repositorio remoto despu\u00e9s de hacer merge o cerrar una tarea, pero permanecen en nuestro entorno local\u2026 ocupando espacio y ensuciando la lista de ramas. Sobre todo dificulta para buscar las ramas que estamos trabajando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pero Git nos da una forma r\u00e1pida de limpiar esas ramas locales que ya no tienen su equivalente remoto. Te explico un comando que uso con frecuencia para dejar mi repositorio local impecable:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddea El comando m\u00e1gico:<\/h3>\n\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><code class=\"\">git fetch -p &amp;&amp; git branch -vv | grep 'gone]' | awk '{print $1}' | xargs git branch -D\n<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udde0 \u00bfQu\u00e9 hace exactamente?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos paso a paso:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li class=\"\"><strong><code>git fetch -p<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li class=\"\">Actualiza la informaci\u00f3n del repositorio remoto.<\/li>\n\n\n\n<li class=\"\">La opci\u00f3n <code>-p<\/code> (o <code>--prune<\/code>) elimina las referencias a ramas remotas que ya no existen.<\/li>\n\n\n\n<li class=\"\">\u2705 <em>Nos asegura que Git sabe cu\u00e1les ramas han desaparecido del remoto.<\/em><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li class=\"\"><strong><code>git branch -vv<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li class=\"\">Muestra todas las ramas locales con detalles: tracking, \u00faltimo commit, y si est\u00e1n desfasadas.<\/li>\n\n\n\n<li class=\"\">Aqu\u00ed es donde Git nos dice si una rama est\u00e1 marcada como <code>[gone]<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li class=\"\"><strong><code>grep 'gone]'<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li class=\"\">Filtra las ramas locales cuyo tracking remoto ha desaparecido.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li class=\"\"><strong><code>awk '{print $1}'<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li class=\"\">Extrae solo el nombre de la rama local de cada l\u00ednea.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li class=\"\"><strong><code>xargs git branch -D<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li class=\"\">Elimina <strong>forzosamente<\/strong> todas esas ramas locales hu\u00e9rfanas.<\/li>\n\n\n\n<li class=\"\">\u26a0\ufe0f Usa <code>-D<\/code> en lugar de <code>-d<\/code> para no tener que comprobar si han sido fusionadas.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udfaf \u00bfCu\u00e1ndo usar este comando?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"\">Despu\u00e9s de hacer merge de ramas de caracter\u00edsticas o fixes.<\/li>\n\n\n\n<li class=\"\">Tras un <code>git pull<\/code> en el main o develop.<\/li>\n\n\n\n<li class=\"\">Cuando notas que tu lista de ramas empieza a parecer un cementerio de ramas antiguas.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udccc Consejo extra<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si prefieres ir con m\u00e1s cuidado, puedes cambiar <code>-D<\/code> por <code>-d<\/code> en el \u00faltimo paso:<\/p>\n\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><code class=\"\">xargs git branch -d\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Esto eliminar\u00e1 solo las ramas que ya han sido fusionadas y evitar\u00e1 p\u00e9rdidas accidentales.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p class=\"wp-block-paragraph\">Con este comando, puedes mantener tu entorno limpio, ordenado y sin ramas obsoletas que solo ocupan espacio. \u00a1Pru\u00e9balo y ver\u00e1s lo bien que sienta una limpieza de ramas<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/medium.com\/@ezequiel.perez\/cleaning-up-local-git-branches-that-no-longer-exist-on-remote-a038d777f8c7\" target=\"_blank\" rel=\"noopener\">Basado en este art\u00edculo de blog<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuando trabajamos en diferentes proyectos y adem\u00e1s usamos la estrategia que siempre recomiendo Trunk Based development, es habitual que creemos muchas ramas temporales. Algunas se eliminan del repositorio remoto despu\u00e9s de hacer merge o cerrar una tarea, pero permanecen en nuestro entorno local\u2026 ocupando espacio y ensuciando la lista de ramas. Sobre todo dificulta para [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5703,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":208,"footnotes":""},"categories":[168],"tags":[],"class_list":["post-4211","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollo-web"],"_links":{"self":[{"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/posts\/4211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/comments?post=4211"}],"version-history":[{"count":1,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/posts\/4211\/revisions"}],"predecessor-version":[{"id":5958,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/posts\/4211\/revisions\/5958"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/media\/5703"}],"wp:attachment":[{"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/media?parent=4211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/categories?post=4211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/tags?post=4211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}