git branch
Listar, crear o eliminar ramas
El comando 'git branch' te permite crear, listar, renombrar y borrar ramas. No sirve para cambiar de rama: para eso usa 'git switch' o 'git checkout'. En Git las ramas son punteros ligeros a commits, así que crear ramas y cambiar entre ellas es rapidísimo. Sin argumentos, git branch lista las ramas existentes y resalta la actual. Con un nombre de rama, crea una rama nueva que apunta al HEAD actual. Las ramas son esenciales para el desarrollo en paralelo: permiten avanzar en varias funcionalidades o arreglos a la vez sin que se estorben.
Sinopsis
git branch [--list] [-a | -r] [-v [--abbrev=<n> | --no-abbrev]] [--merged | --no-merged] [<pattern>...]
git branch <branch-name> [<start-point>]
git branch (-d | -D) [-r] <branch-name>...
git branch (-m | -M) [<old-branch>] <new-branch>
git branch (-c | -C) [<old-branch>] <new-branch>
git branch [--set-upstream-to=<upstream> | -u <upstream>] [<branch-name>]Opciones
Elegir la opción adecuada
Ver ramas
Distintas formas de listar e inspeccionar ramas
| Comando | Muestra locales | Muestra remotas | Información extra | Caso de uso |
|---|---|---|---|---|
git branch | Sí | No | Rama actual marcada con * | Vistazo rápido a las ramas locales |
git branch -r | No | Sí | Referencias de seguimiento remoto | Ver qué hay en el servidor |
git branch -a | Sí | Sí | Todas las referencias | Visión completa de todas las ramas |
git branch -v | Sí | No | Último commit de cada rama | Ver la actividad de las ramas de un vistazo |
git branch -vv | Sí | No | Upstream + adelanto/retraso | Comprobar la sincronización con el remoto |
git branch --show-current | Solo la actual | No | Solo el nombre | Scripts, prompts de la shell |
Borrar ramas
Borrado seguro frente a borrado forzado: conoce la diferencia
| Comando | Exige estar integrada | Puede perder trabajo | Cuándo usarla |
|---|---|---|---|
-d (--delete) | Sí | No | Tras integrar un PR, limpieza rutinaria |
-D (--delete --force) | No | Sí | Abandonar un trabajo experimental |
Renombrar y copiar ramas
Opciones para reorganizar los nombres de tus ramas
| Comando | Sobrescribe la existente | Conserva la original | Uso típico |
|---|---|---|---|
-m (--move) | No (falla) | No | Renombrar: feature → feature-v2 |
-M (--move --force) | Sí | No | Reemplazar un nombre de rama existente |
-c (--copy) | No (falla) | Sí | Duplicar una rama para experimentar |
-C (--copy --force) | Sí | Sí | Copiar, sobrescribiendo si existe |
Filtrar ramas según si están integradas
Encontrar ramas listas para borrar o aún en curso
| Comando | Muestra | Propósito | Paso siguiente habitual |
|---|---|---|---|
--merged | Ramas integradas en HEAD | Encontrar candidatas a limpieza | git branch -d <branch> |
--merged main | Ramas integradas en main | Encontrar ramas que se pueden borrar con seguridad | Borrar en bloque las ramas integradas |
--no-merged | Ramas NO integradas | Encontrar trabajo en curso | Revisar antes de una release |
--contains <commit> | Ramas que contienen un commit | Seguir adónde fue un arreglo | Verificar el despliegue de un hotfix |
Seguimiento del upstream
Configurar la relación entre ramas locales y remotas
| Comando | Acción | Efecto | Cuándo usarla |
|---|---|---|---|
-u origin/main | Fijar el upstream | git push/pull funcionan sin argumentos | Tras crear una rama local |
--track origin/feature | Crear + fijar el upstream | Nueva rama local que sigue a una remota | Empezar a trabajar en una rama remota |
--unset-upstream | Quitar el upstream | Desconectarse del remoto | Dejar de seguir una rama remota borrada |
Ejemplos de flujos de trabajo
git branch feature-loginCrear una rama nueva para la funcionalidad
git switch feature-loginCambiarse a la rama nueva
(make changes and commits)Trabajar en la funcionalidad con varios commits
git switch main && git merge feature-loginIntegrar la funcionalidad terminada en main
git branch -d feature-loginBorrar la rama de la funcionalidad tras el merge
git branch --mergedListar las ramas ya integradas
git branch -d branch-nameBorrar con seguridad las ramas integradas una a una
git fetch --pruneQuitar referencias de seguimiento remoto obsoletas
git branch -rComprobar que las ramas remotas están limpias
git fetch originTraer la información más reciente de las ramas remotas
git branch -rListar las ramas remotas disponibles
git branch --track feature origin/featureCrear una rama local que sigue a la remota
git switch featureCambiarse a la nueva rama de seguimiento
git branch -m old-name new-nameRenombrar la rama local
git push origin -u new-nameSubir el nombre nuevo de la rama al remoto
git push origin --delete old-nameBorrar el nombre antiguo de la rama del remoto
git log --oneline -1Obtener el hash del commit que buscas
git branch --contains <commit-hash>Encontrar ramas locales con este commit
git branch -r --contains <commit-hash>Encontrar ramas remotas con este commit
Solución de problemas
No se puede borrar la rama: no está totalmente integrada
Causa: La rama tiene commits que no están integrados en su upstream (o en HEAD si no tiene upstream)
Integra primero la rama, o usa -D para forzar el borrado si estás seguro de querer descartar ese trabajo
git branch -D branch-nameNo se puede borrar la rama actual
Causa: Estás intentando borrar la rama en la que estás
Cámbiate primero a otra rama y luego borra la rama que quieras
git switch main && git branch -d old-branchEse nombre de rama ya existe
Causa: Estás intentando crear una rama con un nombre que ya existe
Elige otro nombre, borra primero la rama existente o usa -f para moverla a un nuevo punto de partida
git branch -f existing-name <start-point>No hay upstream configurado para el push
Causa: La rama local no tiene relación de seguimiento con ninguna rama remota
Configura la relación de seguimiento con el upstream
git push -u origin branch-nameLa rama remota no aparece en git branch -r
Causa: El repositorio local no tiene la información más reciente de las ramas remotas
Haz fetch desde el remoto para actualizar tus ramas de seguimiento remoto
git fetch originHEAD separado (detached) tras un checkout
Causa: Hiciste checkout de un commit directamente en lugar de una rama
Crea una rama nueva en el commit actual o vuelve a una rama existente
git switch -c new-branch-nameLa rama sigue al remoto equivocado
Causa: El upstream está configurado para seguir una rama remota incorrecta
Vuelve a fijar el seguimiento del upstream en la rama remota correcta
git branch -u origin/correct-branchNo se ven todas las ramas
Causa: Por defecto solo se muestran las ramas locales
Usa la opción -a para mostrar tanto las ramas locales como las de seguimiento remoto
git branch -aConsejos y trampas
Buenas prácticas
- ✓Usa nombres de rama descriptivos que indiquen su propósito: feature/user-auth, bugfix/login-error, hotfix/security-patch
- ✓Borra las ramas tras el merge para mantener limpio el repositorio; usa 'git branch --merged' para encontrar las que se pueden borrar sin riesgo
- ✓Crea siempre las ramas de funcionalidad desde una rama main al día para reducir los conflictos de merge
- ✓Usa 'git branch -vv' para ver las relaciones de seguimiento y cuánto vas por delante o por detrás
- ✓Configura el seguimiento al crear ramas con 'git push -u origin branch-name' para facilitar push y pull
- ✓Evita trabajar directamente en main/master: crea siempre una rama para tus cambios
- ✓Usa 'git branch --no-merged' para encontrar las ramas con trabajo aún en curso
- ✓Sincroniza a menudo las ramas remotas con 'git fetch --prune' para quitar referencias obsoletas
- ✓Plantéate usar 'git switch' en lugar de 'git checkout' para que la intención quede más clara al cambiar de rama
- ✓Usa '--sort=-committerdate' para ver primero las ramas con actividad más reciente
- ✓Antes de borrar una rama con -D, comprueba con 'git log branch-name' que ya no la necesitas
- ✓Escribe los nombres de rama en minúsculas y con guiones, por coherencia y compatibilidad
Errores comunes
- ✗Esperar que 'git branch <name>' te cambie a la rama nueva. Solo la crea: usa 'git switch <name>' o 'git checkout -b <name>' para crearla y cambiarte a ella.
- ✗Intentar borrar la rama actual. Primero tienes que cambiarte a otra rama antes de borrar aquella en la que estás.
- ✗Usar -d en ramas sin integrar y perder trabajo. La opción -d te protege: si de verdad quieres borrar trabajo sin integrar, usa -D.
- ✗Olvidar subir las ramas nuevas al remoto. Las ramas locales no se comparten hasta que haces 'git push -u origin <branch>'.
- ✗No limpiar las ramas viejas. Usa a menudo 'git branch --merged' para encontrar y borrar las ramas ya integradas.
Preguntas frecuentes
'git branch <name>' solo crea una rama nueva, pero no te cambia a ella. 'git checkout -b <name>' crea una rama nueva Y te cambia a ella en un solo comando. El equivalente moderno es 'git switch -c <name>'.
Usa 'git branch -m old-name new-name' para renombrar una rama. Si estás en la rama que quieres renombrar, basta con 'git branch -m new-name'. Para las ramas remotas tendrás que subir el nombre nuevo y borrar el antiguo.
-d es un borrado seguro que solo funciona si la rama está totalmente integrada en su upstream (o en HEAD si no hay upstream). -D es un borrado forzado que elimina la rama sin mirar si está integrada. Usa -D solo cuando estés seguro de querer descartar commits sin integrar.
Usa 'git push origin --delete branch-name' o la sintaxis corta 'git push origin :branch-name'. Esto elimina la rama del repositorio remoto.
Las ramas de seguimiento remoto (como origin/main) son referencias locales que siguen el estado de las ramas de los repositorios remotos. Se actualizan al hacer fetch o pull y te muestran adónde apuntan las ramas remotas.
Usa 'git branch --show-current' para ver solo el nombre, o 'git branch' para ver todas las ramas con la actual marcada con *. 'git status' también muestra la rama actual.
Git no permite borrar la rama en la que estás. Cámbiate primero a otra rama con 'git switch other-branch' y luego borra la rama que quieras.
Usa 'git branch branch-name commit-hash' para crear una rama que empiece en cualquier commit. Como punto de partida puedes usar un hash de commit, una etiqueta u otro nombre de rama.
La rama upstream (o de seguimiento) es la rama remota a la que tu rama local sube y de la que trae cambios por defecto. Fíjala con 'git branch -u origin/branch-name' o 'git push -u origin branch-name'.
Usa 'git branch --sort=-committerdate' para listar primero las ramas con los commits más recientes. Añade -v para ver también el hash y el mensaje del commit.