lección 8
Proyecto: colaborar en un repo como en una empresa
Pon todo en práctica: crea un repo, simula un equipo con múltiples branches, crea PRs y resuelve conflictos. Tu primera experiencia profesional con Git.
⏱ 55 min
Ha llegado el momento de juntar todas las piezas. En esta lección-proyecto, vas a simular ser parte de un equipo de ingeniería de datos. Crearás un repo en GitHub, trabajarás con múltiples branches como si fueras diferentes personas del equipo, crearás Pull Requests, resolverás un conflicto y seguirás el flujo profesional de principio a fin. Cuando termines, habrás ejecutado exactamente el mismo flujo que usa un ingeniero de datos en su día a día.
El escenario: trabajas en FreshData Corp, una empresa de analítica para supermercados. El equipo está construyendo un pipeline que procesa las ventas diarias de 50 tiendas. Hay 3 tareas pendientes: una nueva feature, un bug fix y una mejora de documentación. Tú vas a "ser" los 3 miembros del equipo, cada uno en su branch.
### Paso 1: Crear el repo del proyecto
1# Crear el proyecto localmente2mkdir freshdata-pipeline3cd freshdata-pipeline4git init56# Crear la estructura base del proyecto7# 🟦 Windows (PowerShell):8New-Item -ItemType Directory -Path src, tests, docs9New-Item src/pipeline.py10New-Item src/config.py11New-Item tests/test_pipeline.py12New-Item docs/README.md13New-Item .gitignore1415# 🍎 Mac (Terminal):16mkdir src tests docs17touch src/pipeline.py src/config.py tests/test_pipeline.py docs/README.md .gitignore
Estructura del proyecto FreshData
Ahora vamos a darle contenido a los archivos base:
1# src/pipeline.py - Pipeline de ventas de FreshData Corp23def cargar_ventas(archivo):4 """Carga datos de ventas desde un archivo CSV."""5 print(f"Cargando ventas desde: {archivo}")6 # Simulamos datos7 ventas = [8 {"tienda": "T001", "producto": "Leche", "cantidad": 150, "precio": 1.20},9 {"tienda": "T001", "producto": "Pan", "cantidad": 200, "precio": 0.80},10 {"tienda": "T002", "producto": "Leche", "cantidad": 90, "precio": 1.20},11 {"tienda": "T002", "producto": "Huevos", "cantidad": 75, "precio": 2.50},12 ]13 return ventas1415def calcular_total_tienda(ventas, tienda_id):16 """Calcula el total de ventas de una tienda."""17 total = 018 for venta in ventas:19 if venta["tienda"] == tienda_id:20 total += venta["cantidad"] * venta["precio"]21 return total2223if __name__ == "__main__":24 ventas = cargar_ventas("ventas_2024_01.csv")25 total = calcular_total_tienda(ventas, "T001")26 print(f"Total tienda T001: ${total:.2f}")
src/pipeline.py — el pipeline base del equipo
1# src/config.py - Configuración del pipeline2ARCHIVO_VENTAS = "ventas_2024_01.csv"3TIENDAS_ACTIVAS = ["T001", "T002", "T003"]4MONEDA = "EUR"5IVA = 0.21
src/config.py — configuración del proyecto
1# Commit inicial y subir a GitHub2git add .3git commit -m "feat: estructura inicial del pipeline de ventas"45# Crear repo en GitHub (con GitHub CLI)6gh repo create freshdata-pipeline --public --source=. --push78# O manualmente:9# 1. Crear repo en github.com10# 2. git remote add origin https://github.com/TU-USUARIO/freshdata-pipeline.git11# 3. git push -u origin main
Commit inicial y subir a GitHub
### Paso 2: Feature — Ana añade resumen por producto
Eres Ana. El product manager pidió un resumen de ventas por producto (no solo por tienda). Creas tu branch y trabajas:
1# "Ana" crea su branch2git switch -c feature/resumen-por-producto
Ana crea su feature branch
1# Ana añade esta función a src/pipeline.py (al final, antes del if __name__)23def resumen_por_producto(ventas):4 """Genera resumen de ventas agrupado por producto."""5 resumen = {}6 for venta in ventas:7 producto = venta["producto"]8 ingreso = venta["cantidad"] * venta["precio"]9 if producto in resumen:10 resumen[producto] += ingreso11 else:12 resumen[producto] = ingreso13 return resumen
Ana añade resumen_por_producto() al pipeline
1# Ana commitea y sube su branch2git add src/pipeline.py3git commit -m "feat: función de resumen de ventas por producto"4git push -u origin feature/resumen-por-producto56# Ana crea el PR7gh pr create --title "feat: resumen de ventas por producto" \8 --body "Añade resumen_por_producto() que agrupa ingresos por producto."
Ana sube su branch y crea PR
### Paso 3: Fix — Pedro corrige el cálculo de total
Eres Pedro. Descubriste que calcular_total_tienda no aplica IVA. El CEO vio números incorrectos en el dashboard. Corriges el bug:
1# Vuelve a main (como si fueras Pedro empezando su día)2git switch main3git switch -c fix/total-con-iva
Pedro crea su branch para el fix
1# Pedro MODIFICA la función calcular_total_tienda en src/pipeline.py:23def calcular_total_tienda(ventas, tienda_id, con_iva=True):4 """Calcula el total de ventas de una tienda (con IVA por defecto)."""5 total = 06 for venta in ventas:7 if venta["tienda"] == tienda_id:8 total += venta["cantidad"] * venta["precio"]9 if con_iva:10 from config import IVA11 total *= (1 + IVA)12 return total
Pedro corrige calcular_total_tienda para incluir IVA
1# Pedro commitea y sube2git add src/pipeline.py3git commit -m "fix: incluir IVA en cálculo de total por tienda"4git push -u origin fix/total-con-iva56# Pedro crea su PR7gh pr create --title "fix: cálculo de total sin IVA" \8 --body "El total no incluía IVA. El CEO vio números incorrectos."
Pedro sube su fix y crea PR
### Paso 4: Mergear y resolver el conflicto
Ahora viene lo interesante. Ambos PRs modificaron src/pipeline.py. Si mergeamos el PR de Ana primero y luego intentamos el de Pedro, habrá conflicto (o viceversa). Esto es exactamente lo que pasa en equipos reales. Vamos a resolverlo:
1# Mergear el PR de Ana primero (desde GitHub web o CLI)2gh pr merge 1 --squash34# Actualizar main local5git switch main6git pull78# Ahora el PR de Pedro tiene conflicto con main9# Pedro actualiza su branch con lo último de main:10git switch fix/total-con-iva11git merge main12# ¡CONFLICTO en src/pipeline.py!1314# Abrir el archivo, resolver el conflicto:15# - Mantener la función de Ana (resumen_por_producto)16# - Mantener el fix de Pedro (IVA en calcular_total_tienda)17# - Borrar las marcas de conflicto1819git add src/pipeline.py20git commit -m "merge: resolver conflicto con feature de resumen"21git push2223# Ahora el PR de Pedro se puede mergear sin problemas24gh pr merge 2 --squash
Resolver el conflicto y completar ambos merges
### Paso 5: Docs — Lucía documenta el proyecto
Eres Lucía. Tu tarea es documentar el proyecto ahora que tiene la feature nueva y el fix. Esta branch no debería tener conflictos porque toca archivos distintos:
1git switch main2git pull # Tener lo último (ambos merges)3git switch -c docs/documentar-pipeline
Lucía crea su branch de docs
1# docs/README.md que escribe Lucía:2"""3# FreshData Pipeline45Pipeline de procesamiento de ventas diarias para FreshData Corp.67## Funcionalidades8- Carga de datos de ventas desde CSV9- Cálculo de totales por tienda (con IVA)10- Resumen de ingresos por producto1112## Uso13python src/pipeline.py1415## Equipo16- Ana: resumen por producto17- Pedro: corrección de IVA18- Lucía: documentación1920## Estructura21freshdata-pipeline/22├── src/23│ ├── pipeline.py # Lógica principal24│ └── config.py # Configuración25├── tests/26│ └── test_pipeline.py27├── docs/28│ └── README.md29└── .gitignore30"""
Lucía escribe la documentación del proyecto
1# Lucía commitea, sube y crea PR2git add docs/README.md3git commit -m "docs: documentar pipeline y estructura del proyecto"4git push -u origin docs/documentar-pipeline5gh pr create --title "docs: README del proyecto" \6 --body "Documenta funcionalidades, uso y estructura."78# Este PR se mergea sin conflictos (toca archivos distintos)9gh pr merge 3 --squash
Lucía completa su PR sin conflictos
### Resultado final: historial limpio y profesional
1# Actualizar y ver el historial final2git switch main3git pull45git log --oneline6# abc1234 docs: README del proyecto (#3)7# def5678 fix: cálculo de total sin IVA (#2)8# ghi9012 feat: resumen de ventas por producto (#1)9# xyz0000 feat: estructura inicial del pipeline de ventas1011# ¡Historial limpio! Cada commit = un PR completo.12# Gracias a "squash and merge", no hay commits intermedios.
El historial perfecto: cada commit es una unidad de trabajo completa
Esto es exactamente lo que verás en tu primer día de trabajo. Un repo con un historial así es un placer para trabajar. Cuando necesites encontrar "cuándo se añadió el IVA", haces git log --grep="IVA" y lo encuentras en segundos. Eso es profesionalismo.
### Limpiar branches y verificar
1# Borrar branches locales ya fusionadas2git branch -d feature/resumen-por-producto3git branch -d fix/total-con-iva4git branch -d docs/documentar-pipeline56# Verificar que solo queda main7git branch8# * main910# Borrar branches remotas (GitHub las borra auto al mergear PR)11git fetch --prune # Limpia referencias a branches remotas borradas
Limpiar todo después del proyecto
Si en tu trabajo real te encuentras con un repo que tiene 50+ branches sin borrar, es señal de un equipo sin disciplina. Propón limpiar en la retro. Las branches son baratas de crear pero un cementerio de branches confunde a todos.
### Recapitulación: todo lo que aprendiste
En esta skill has pasado de usar Git solo para "guardar partida" a usarlo como un profesional en equipo. Repasemos el viaje:
- 01.Branches: universos paralelos para trabajar sin pisarse
- 02.git switch -c: crear y moverte a una branch en un paso
- 03.git merge: fusionar una branch cuando tu trabajo está listo
- 04.GitHub: tu código en la nube con backup y colaboración
- 05.git push/pull: sincronizar entre local y remoto
- 06.Pull Requests: pedir revisión antes de meter código en main
- 07.Conflictos: no son errores, son Git pidiendo tu decisión
- 08.Flujo simplificado: main + feature branches + PRs = profesionalismo
- 09.Conventional Commits: mensajes claros y buscables
- 10..gitignore: lo que nunca debe subir al repo
Con esto, estás listo para trabajar en equipo en cualquier empresa. El flujo que practicaste aquí es el mismo que usan equipos en Google, Netflix, Spotify y cualquier startup seria. La próxima vez que alguien te diga "clona el repo y haz un PR", sabrás exactamente qué hacer.
## ejercicios
Secuencia completa del proyecto
Escribe TODA la secuencia de comandos Git necesaria para: crear repo, subir a GitHub, crear 2 feature branches, hacer PRs y mergear todo. Este es tu checklist profesional.
Simula un equipo con Python
Crea un script Python que genere y ejecute los comandos Git necesarios para simular un flujo de equipo completo. El script debe crear el repo, las branches y los commits.
Tu checklist del primer día de trabajo
Crea un script que imprima la checklist completa de lo que harás tu primer día en una empresa: clonar repo, entender estructura, crear tu primera branch, hacer tu primer PR.
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...