Introducción
Los branches son cómo Git soporta líneas de trabajo paralelas. Crear un branch es esencialmente gratis: es solo un archivo de 41 bytes que contiene un hash de commit. Úsalos generosamente para features, experimentos y arreglos de bugs.
Comandos modernos
Desde Git 2.23 hay dos comandos especializados: git switch para branches y git restore para archivos. Úsalos; son más claros que el comportamiento sobrecargado de git checkout.
git switch main # cambiar a un branch existente
git switch -c feature/login # crear y cambiar
git switch -c hotfix v1.2.3 # crear desde un tag
git switch - # branch anterior (como cd -)
Listando branches
git branch # local
git branch -r # remote-tracking
git branch -a # todos
git branch -vv # con upstream y ahead/behind
git branch --merged # mergeados al actual
git branch --no-merged # aún no mergeados
Renombrando y eliminando
git branch -m old new # renombrar
git branch -m new # renombrar el branch actual
git branch -d feature/login # eliminar branch mergeado
git branch -D feature/abandoned # forzar eliminación de no mergeado
-d rechaza si el branch tiene commits no mergeados, protegiendo el trabajo.
Rastreando branches remotos
git switch feature/login # auto-crea local desde origin/feature/login
git switch -c mine origin/feature/login # explícito
git branch -u origin/main # establecer upstream del branch actual
La sintaxis clásica
Los tutoriales antiguos usan git checkout. Aún funciona:
git checkout main
git checkout -b feature/login
git checkout v1.2.3
El inconveniente es que el mismo comando también restaura archivos, lo que causa confusión. Prefiere switch y restore en scripts nuevos.
Convenciones de nombres de branches
Los nombres consistentes facilitan las herramientas. Patrones comunes:
feature/<ticket>-short-descbugfix/<ticket>-short-deschotfix/<version>release/<version>
git switch -c feature/PROJ-123-add-search
git config --global branch.autoSetupMerge always
git config --global branch.autoSetupRebase always
Las opciones autoSetup aseguran que los nuevos branches automáticamente rastreen su punto de partida, lo que hace que la línea ahead/behind de git status sea significativa desde el día uno.
Renombrando en el remoto
Renombrar un branch remoto son dos operaciones: renombrar localmente y crear la nueva ref en el servidor, luego eliminar la antigua:
git branch -m old new
git push -u origin new
git push origin --delete old
Errores comunes
Cambiar de branch con cambios no commiteados que conflictan con el destino; Git rechaza, y el arreglo es commitear, stashear o usar git switch --discard-changes si realmente no los quieres. Crear docenas de branches de larga vida y nunca eliminar los mergeados; git branch --merged | xargs git branch -d ordena. Nombrar branches con caracteres que confunden a las shells (espacios, caracteres glob); apégate a letras, dígitos, slash y guión. Finalmente, eliminar un branch con -D y entrar en pánico al darte cuenta de que tenía trabajo no mergeado; el reflog aún lo tiene durante 90 días: git reflog, encuentra el SHA, git switch -c rescued <sha>.