lección 2

Por qué necesitas branches (y qué pasa sin ellas)

El problema de trabajar todos en main: un solo error lo rompe todo. Branches son universos paralelos donde experimentas sin miedo.

45 min

Ya sabes guardar partida. Sabes hacer git add, git commit, revisar el historial con git log. Eres un lobo solitario del control de versiones y te sientes cómodo. Pero ahora imagina esto: llegas el lunes a tu primer día de trabajo en DataCorp, una empresa con 12 ingenieros de datos. Tu líder técnico te dice "el repo está en GitHub, clona y empieza a trabajar". Haces tu primer cambio, commiteas, y de pronto ves un mensaje aterrador: CONFLICT. Tu compañera María hizo un cambio en el mismo archivo hace 5 minutos. Bienvenido al mundo real.

Todo lo que aprendiste hasta ahora funcionaba porque trabajabas solo. Un solo desarrollador, una sola línea temporal, una sola versión de la verdad. Pero el software profesional no se construye solo. Se construye en equipo. Y cuando hay equipo, hay un problema fundamental: ¿cómo trabajan 5, 10 o 50 personas en el mismo código sin pisarse constantemente?

### La pesadilla de trabajar todos en main

Imagina una oficina donde todos escriben en el mismo documento de Word. No copias del documento — el mismo archivo, al mismo tiempo. Ana está escribiendo la introducción. Pedro cambia una tabla en la página 3. Lucía borra un párrafo que pensaba que sobraba... pero que Ana estaba referenciando. El resultado es caos puro. Eso es exactamente lo que pasa cuando un equipo trabaja directamente en la rama main sin branches.

He visto esto en producción más veces de las que me gustaría admitir. En 2016, trabajaba en una startup de analítica y un junior commiteó directamente a main un script de limpieza de datos que tenía un bug sutil: convertía todos los precios a 0 si el campo estaba vacío. El pipeline corrió esa noche, los dashboards mostraron ventas de $0 al CEO a las 7am, y el junior casi renuncia de la vergüenza. El problema no fue el bug — los bugs son inevitables. El problema fue que no había ningún mecanismo que impidiera meter código roto directamente en la versión "oficial".

  • Si alguien mete un bug, TODOS lo tienen inmediatamente
  • No hay forma de "probar" algo sin afectar al equipo
  • Cada commit es como operar a corazón abierto sin anestesia
  • El historial es un río turbio donde no distingues qué cambio rompió qué
  • Revertir un error implica revertir también el trabajo bueno de otros

### La analogía: universos paralelos

Piensa en las películas de ciencia ficción donde existen universos paralelos. En el universo principal, todo funciona: la app está en producción, los clientes la usan, el pipeline procesa datos cada noche. Ahora imagina que pudieras crear un universo paralelo exactamente igual, hacer tus experimentos ahí — probar, romper, arreglar, iterar — y solo cuando estés 100% seguro de que todo funciona, fusionar ese universo paralelo con el principal. Si tu experimento sale mal, simplemente destruyes ese universo paralelo. El universo principal nunca se enteró.

Eso es EXACTAMENTE lo que es una branch en Git. Una rama es un universo paralelo de tu código. Creas una, trabajas en ella todo lo que necesites, y cuando tu trabajo está listo y probado, lo fusionas con la realidad principal (main). Si sale mal, borras la branch y como si nada. Main permanece intacto, limpio, funcionando.

Una branch es un universo paralelo: experimentas sin tocar main

### Qué es main (y por qué es sagrado)

Main (antes se llamaba "master", pero la comunidad migró al término "main" por razones de inclusividad) es la rama que representa la versión oficial de tu proyecto. Es el "universo real". Todo lo que está en main debería funcionar siempre. En empresas profesionales, main es lo que está en producción — lo que usan los clientes reales. Por eso es sagrado: nadie debería meter código directamente ahí sin que alguien lo revise primero.

Regla de oro que le diría a mi yo de hace 10 años: NUNCA commitees directamente a main en un proyecto de equipo. Siempre crea una branch, trabaja ahí, y pide una revisión antes de fusionar. Incluso si eres el único en el proyecto — el hábito vale oro cuando trabajes con otros.

### La historia detrás de las branches

Las branches no son un invento de Git. Existían en sistemas de control de versiones anteriores como CVS y Subversion (SVN). Pero había un problema: crear una branch en SVN era LENTO. Literalmente copiaba todos los archivos del proyecto. Si tu repo tenía 10.000 archivos, crear una branch implicaba duplicar esos 10.000 archivos. Por eso, en la era SVN, las branches se usaban con cuentagotas — solo para releases importantes o emergencias.

Git cambió todo en 2005 cuando Linus Torvalds lo diseñó para el kernel de Linux. En Git, crear una branch es instantáneo. Literalmente cuesta 41 bytes — un puntero a un commit. No copia archivos, no duplica nada, no tarda. Puedes crear 100 branches sin que tu disco duro note la diferencia. Esta decisión de diseño transformó la forma en que los equipos trabajan: si las branches son gratis, úsalas para TODO.

En Git, una branch es simplemente un nombre que apunta a un commit. Nada más. No es una copia del proyecto, no es una carpeta nueva. Es un Post-it que dice "estoy aquí". Por eso son tan baratas de crear y borrar.

### El flujo mental: cómo piensa un equipo con branches

Cuando un equipo usa branches correctamente, el flujo es así: llega una tarea nueva (por ejemplo, "añadir validación de emails en el pipeline de ingesta"). El desarrollador crea una branch desde main, la llama algo descriptivo como feature/validar-emails, trabaja ahí durante horas o días, y cuando termina, pide que alguien revise su trabajo. Si todo está bien, se fusiona con main. Si hay problemas, se corrigen en la branch sin afectar a nadie más.

  1. 01.Tienes una tarea → creas una branch nueva desde main
  2. 02.Trabajas en tu branch → commits, pruebas, iteraciones
  3. 03.Terminas → pides revisión (Pull Request)
  4. 04.Aprobado → fusionas tu branch con main
  5. 05.Limpias → borras la branch (ya no la necesitas)

### Visualizando el problema sin branches

Veamos un ejemplo concreto. Imagina un equipo de 3 personas trabajando en un pipeline de datos para un e-commerce. Ana está arreglando un bug en el cálculo de IVA. Pedro está añadiendo una nueva fuente de datos (API de pagos). Lucía está refactorizando las funciones de limpieza. Si los tres trabajan directamente en main:

  • Ana commitea su fix de IVA → Pedro hace pull y su código deja de funcionar porque Ana cambió la función que Pedro usaba
  • Pedro arregla su código y commitea → Lucía hace pull y tiene 4 conflictos porque renombró las mismas funciones
  • Lucía está bloqueada 2 horas resolviendo conflictos en vez de programar
  • Nadie sabe si main funciona en este momento → ¿está roto el pipeline de producción?

Con branches, cada uno trabaja en su universo paralelo. Ana en fix/calculo-iva, Pedro en feature/api-pagos, Lucía en refactor/funciones-limpieza. Main permanece estable. Cada uno fusiona cuando su trabajo está listo y probado. Los conflictos se resuelven de forma controlada, uno a la vez, no todos a la vez en un caos.

El error más común de principiantes: pensar que las branches son "para proyectos grandes". No. Usa una branch incluso para un cambio de 3 líneas. El hábito es lo que importa. Cuando el cambio de 3 líneas rompa algo (y lo hará), agradecerás no haberlo metido directo a main.

### Nomenclatura de branches: ponle nombre con sentido

Una branch se llama como quieras, pero los equipos profesionales siguen convenciones. El nombre debe decir QUÉ estás haciendo. No "mi-branch" o "test-cosa" — sino algo que cualquier compañero entienda sin preguntarte. Las convenciones más comunes usan prefijos:

  • feature/nombre-descriptivo → para funcionalidad nueva (feature/ingesta-api-pagos)
  • fix/nombre-del-bug → para correcciones (fix/calculo-iva-null)
  • refactor/que-cambias → para mejoras internas (refactor/funciones-limpieza)
  • docs/que-documentas → para documentación (docs/readme-setup)

Usa guiones (-) en vez de espacios o underscores. Mantén los nombres cortos pero descriptivos. Tu yo del futuro (y tus compañeros) te lo agradecerán cuando miren el listado de branches y sepan qué hace cada una sin abrir el código.

### Resumen: el contrato social de las branches

Usar branches es un contrato social del equipo. Todos acuerdan: "main siempre funciona, nadie commitea directamente ahí, cada tarea se hace en su branch, y antes de fusionar pedimos revisión". Es como las reglas de tráfico: sin ellas, cada uno conduce por donde quiere y hay accidentes. Con ellas, el tráfico fluye. En la próxima lección, vas a crear tu primera branch, moverte entre ellas y fusionarlas. Prepárate para abrir portales a universos paralelos.

## ejercicios

[01]

Diagnóstico: ¿qué puede salir mal?

Tu equipo tiene 3 personas trabajando directamente en main. Escribe un script Python que simule el problema: crea un archivo, modifícalo como lo haría cada persona, y muestra dónde surge el conflicto conceptual. El script debe imprimir los pasos del desastre.

Cargando editor...
[02]

Nombra estas branches correctamente

Tu equipo necesita branches para estas tareas. Escribe un script que imprima el nombre correcto de branch para cada tarea según la convención feature/, fix/, refactor/, docs/.

Cargando editor...
[03]

Quiz: conceptos de branches

Responde estas preguntas sobre branches creando un diccionario con las respuestas correctas.

Cargando editor...

Regístrate para guardar tu progreso.

## comentarios

Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.

Inicia sesión para comentar y responder.

cargando comentarios...