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 localmente
2mkdir freshdata-pipeline
3cd freshdata-pipeline
4git init
5
6# Crear la estructura base del proyecto
7# 🟦 Windows (PowerShell):
8New-Item -ItemType Directory -Path src, tests, docs
9New-Item src/pipeline.py
10New-Item src/config.py
11New-Item tests/test_pipeline.py
12New-Item docs/README.md
13New-Item .gitignore
14
15# 🍎 Mac (Terminal):
16mkdir src tests docs
17touch 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 Corp
2
3def cargar_ventas(archivo):
4 """Carga datos de ventas desde un archivo CSV."""
5 print(f"Cargando ventas desde: {archivo}")
6 # Simulamos datos
7 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 ventas
14
15def calcular_total_tienda(ventas, tienda_id):
16 """Calcula el total de ventas de una tienda."""
17 total = 0
18 for venta in ventas:
19 if venta["tienda"] == tienda_id:
20 total += venta["cantidad"] * venta["precio"]
21 return total
22
23if __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 pipeline
2ARCHIVO_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 GitHub
2git add .
3git commit -m "feat: estructura inicial del pipeline de ventas"
4
5# Crear repo en GitHub (con GitHub CLI)
6gh repo create freshdata-pipeline --public --source=. --push
7
8# O manualmente:
9# 1. Crear repo en github.com
10# 2. git remote add origin https://github.com/TU-USUARIO/freshdata-pipeline.git
11# 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 branch
2git 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__)
2
3def 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] += ingreso
11 else:
12 resumen[producto] = ingreso
13 return resumen

Ana añade resumen_por_producto() al pipeline

1# Ana commitea y sube su branch
2git add src/pipeline.py
3git commit -m "feat: función de resumen de ventas por producto"
4git push -u origin feature/resumen-por-producto
5
6# Ana crea el PR
7gh 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 main
3git 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:
2
3def calcular_total_tienda(ventas, tienda_id, con_iva=True):
4 """Calcula el total de ventas de una tienda (con IVA por defecto)."""
5 total = 0
6 for venta in ventas:
7 if venta["tienda"] == tienda_id:
8 total += venta["cantidad"] * venta["precio"]
9 if con_iva:
10 from config import IVA
11 total *= (1 + IVA)
12 return total

Pedro corrige calcular_total_tienda para incluir IVA

1# Pedro commitea y sube
2git add src/pipeline.py
3git commit -m "fix: incluir IVA en cálculo de total por tienda"
4git push -u origin fix/total-con-iva
5
6# Pedro crea su PR
7gh 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 --squash
3
4# Actualizar main local
5git switch main
6git pull
7
8# Ahora el PR de Pedro tiene conflicto con main
9# Pedro actualiza su branch con lo último de main:
10git switch fix/total-con-iva
11git merge main
12# ¡CONFLICTO en src/pipeline.py!
13
14# 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 conflicto
18
19git add src/pipeline.py
20git commit -m "merge: resolver conflicto con feature de resumen"
21git push
22
23# Ahora el PR de Pedro se puede mergear sin problemas
24gh 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 main
2git 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 Pipeline
4
5Pipeline de procesamiento de ventas diarias para FreshData Corp.
6
7## Funcionalidades
8- Carga de datos de ventas desde CSV
9- Cálculo de totales por tienda (con IVA)
10- Resumen de ingresos por producto
11
12## Uso
13python src/pipeline.py
14
15## Equipo
16- Ana: resumen por producto
17- Pedro: corrección de IVA
18- Lucía: documentación
19
20## Estructura
21freshdata-pipeline/
22├── src/
23│ ├── pipeline.py # Lógica principal
24│ └── config.py # Configuración
25├── tests/
26│ └── test_pipeline.py
27├── docs/
28│ └── README.md
29└── .gitignore
30"""

Lucía escribe la documentación del proyecto

1# Lucía commitea, sube y crea PR
2git add docs/README.md
3git commit -m "docs: documentar pipeline y estructura del proyecto"
4git push -u origin docs/documentar-pipeline
5gh pr create --title "docs: README del proyecto" \
6 --body "Documenta funcionalidades, uso y estructura."
7
8# 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 final
2git switch main
3git pull
4
5git log --oneline
6# 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 ventas
10
11# ¡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 fusionadas
2git branch -d feature/resumen-por-producto
3git branch -d fix/total-con-iva
4git branch -d docs/documentar-pipeline
5
6# Verificar que solo queda main
7git branch
8# * main
9
10# 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:

  1. 01.Branches: universos paralelos para trabajar sin pisarse
  2. 02.git switch -c: crear y moverte a una branch en un paso
  3. 03.git merge: fusionar una branch cuando tu trabajo está listo
  4. 04.GitHub: tu código en la nube con backup y colaboración
  5. 05.git push/pull: sincronizar entre local y remoto
  6. 06.Pull Requests: pedir revisión antes de meter código en main
  7. 07.Conflictos: no son errores, son Git pidiendo tu decisión
  8. 08.Flujo simplificado: main + feature branches + PRs = profesionalismo
  9. 09.Conventional Commits: mensajes claros y buscables
  10. 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

[01]

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.

Cargando editor...
[02]

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.

Cargando editor...
[03]

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.

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...