Treinta y un capítulos después, toca juntarlo. Y no en un resumen: en un repositorio que puedas mandar por WhatsApp y que hable bien de ti 🏆
Las siete piezas
| Pieza | Capítulo | Qué demuestra |
|---|---|---|
| README con instrucciones | 18 | Que piensas en quien llega |
.gitignore | 9 | Que sabes qué no va |
| Licencia | 16 | Que sabes lo que estás publicando |
| Commits legibles | 5 | Cómo trabajas |
| Una rama fusionada | 10 | Que no trabajas todo en main |
| Una versión etiquetada | 24 | Que piensas en quien lo usa |
| Revisión automática | 31 | Que compruebas lo que entregas |
Paso 1: la base
mkdir ventas-miss-yera cd ventas-miss-yera git init -q printf 'ciudad,monto\nLima,1200\nArequipa,890\nCusco,760\n' > ventas.csv printf 'API_KEY=no-deberia-estar-aqui\n' > .env printf '.env\n__pycache__/\n' > .gitignore git add ventas.csv .gitignore git commit -q -m "Primeras ventas por ciudad" git status --short git ls-files
.gitignore ventas.csv
Fíjate en que el .env existe en la carpeta y no está en la
lista. Primera pieza colocada 🚫
Paso 2: el README y la licencia
cat > README.md <<'FIN' # Ventas Miss Yera Calcula el total de ventas por ciudad a partir de un CSV. ## Necesitas - Bash ## Usar ``` bash total.sh ventas.csv ``` Devuelve el monto total de todas las ciudades. FIN printf 'MIT License\n\nCopyright (c) 2026 Gera Flores\n' > LICENSE git add README.md LICENSE git commit -q -m "Se agregan el README y la licencia MIT" git ls-files
.gitignore LICENSE README.md ventas.csv
Paso 3: el trabajo, en su rama
git switch -q -c calcula-el-total cat > total.sh <<'FIN' tail -n +2 "$1" | cut -d, -f2 | paste -sd+ | bc FIN git add total.sh git commit -q -m "Se agrega el calculo del total por ciudad Lee el CSV, se salta la cabecera y suma la segunda columna." bash total.sh ventas.csv git log --oneline
2850 409858b Se agrega el calculo del total por ciudad 75bc321 Se agregan el README y la licencia MIT 533e566 Primeras ventas por ciudad
Funciona. Y el commit tiene cuerpo, que es lo que va a leer quien mire tu historia dentro de un año 📖
Paso 4: fusionar dejando rastro
git switch -q main
git merge -q --no-ff -m "Entra el calculo del total por ciudad" calcula-el-total
git branch -d calcula-el-total
git log --oneline --topo-order
git branch
Deleted branch calcula-el-total (was 409858b). 276beee Entra el calculo del total por ciudad 409858b Se agrega el calculo del total por ciudad 75bc321 Se agregan el README y la licencia MIT 533e566 Primeras ventas por ciudad * main
El --no-ff deja escrito que hubo una rama, y borrarla después
deja la lista limpia. Así se ve un repositorio donde alguien trabajó ordenado 🌿
Ese --topo-order es el único invitado nuevo de este capítulo, y
está por un motivo concreto: sin él, git log ordena por la hora de
cada commit, y como los tuyos los vas a hacer en otro orden que yo, la lista te
saldría distinta a la de aquí. Con él manda la forma de la historia y no el
reloj, así que a ti te sale exactamente esto 🕰️
Paso 5: la revisión automática
mkdir -p .github/workflows cat > .github/workflows/revisa.yml <<'FIN' name: Revisa el CSV de ventas on: push: pull_request: jobs: revisar: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: | tail -n +2 ventas.csv | cut -d, -f2 | grep -q '^$' && exit 1 echo "CSV correcto" FIN git add .github git commit -q -m "Se revisa el CSV en cada push" tail -n +2 ventas.csv | cut -d, -f2 | grep -q '^$' && exit 1 echo "la revision pasa"
la revision pasa
Paso 6: la primera versión
git tag -a v1.0 -m "Primera version del reporte por ciudad" git tag git describe --tags git log --oneline --decorate -1
v1.0 v1.0 a518f4e (HEAD -> main, tag: v1.0) Se revisa el CSV en cada push
Paso 7: publicarlo
cd .. git init -q --bare servidor.git cd ventas-miss-yera git remote add origin ../servidor.git git push -q -u origin main git push -q origin --tags git ls-remote origin
a518f4e618f8c79df5dee7b9adf0920e4534f523 HEAD
a518f4e618f8c79df5dee7b9adf0920e4534f523 refs/heads/main
b5770ff08550961371f61e0bdd160c1b9d8cb470 refs/tags/v1.0
a518f4e618f8c79df5dee7b9adf0920e4534f523 refs/tags/v1.0^{}
Con GitHub la única diferencia es la dirección, y ahí lo que sigue es entrar a la web, comprobar que el repositorio esté como quieres y decidir si va público o privado. Todo lo demás ya está hecho 🚀
La revisión final
echo "== que se publica ==" && git ls-files echo "== historia ==" && git log --oneline --topo-order echo "== versiones ==" && git tag echo "== nada suelto ==" && git status --short && echo "limpio"
== que se publica == .github/workflows/revisa.yml .gitignore LICENSE README.md total.sh ventas.csv == historia == a518f4e Se revisa el CSV en cada push 276beee Entra el calculo del total por ciudad 409858b Se agrega el calculo del total por ciudad 75bc321 Se agregan el README y la licencia MIT 533e566 Primeras ventas por ciudad == versiones == v1.0 == nada suelto == limpio
Siete archivos, historia legible, una versión marcada y nada pendiente. Eso es un repositorio que se puede enseñar 🎓
La trampa
Terminas tu proyecto, lo subes a GitHub y lo pones en tu currículum. Nadie lo abre dos veces.
$ git ls-files analisis.py datos.csv notebook.ipynb prueba2.py prueba_final.py prueba_final_v2.py
Qué está mal
Un repositorio sin README y con tres pruebas finales 😬
Quien entra a tu proyecto le da treinta segundos. En esos treinta segundos tiene que entender qué hace, ver que se puede ejecutar y llevarse la impresión de que trabajas ordenado.
Los nombres prueba_final_v2 cuentan justo lo contrario, y son exactamente el problema del capítulo 1 que este libro vino a resolver.
Un proyecto de portafolio necesita tres cosas: README con instrucciones, historia de commits legible y nada de archivos sueltos. Eso pesa más que el código.
Comprueba que se entendió
Comprueba que lo tienes
Vas a poner un repositorio en tu currículum. ¿Qué mira primero quien lo abra?
- El README y si se entiende qué hace
- La cantidad de commits
- El lenguaje que aparece arriba
- Las estrellas que tenga
Ejercicios
1. Arranca tu repositorio con lo que no va
Base del catálogo, con .gitignore desde el
primer commit.
cd .. mkdir catalogo-bodegas cd catalogo-bodegas git init -q printf 'bodega,ciudad,monto\nBodega Inti,Cusco,760\n' > bodegas.csv printf 'API_KEY=fuera\n' > .env printf '.env\n' > .gitignore git add bodegas.csv .gitignore git commit -q -m "Catalogo inicial de bodegas" git ls-files git status --short
.gitignore bodegas.csv
El .env ni aparece. Así se empieza 🚫
2. Ponle portada y licencia
Las dos piezas que se miran primero.
cat > README.md <<'FIN' # Catalogo de bodegas Lista de bodegas por ciudad con su venta mensual. ## Usar ``` bash total.sh bodegas.csv ``` FIN printf 'MIT License\n\nCopyright (c) 2026 Gera Flores\n' > LICENSE git add README.md LICENSE git commit -q -m "Se agregan el README y la licencia MIT" git ls-files
.gitignore LICENSE README.md bodegas.csv
Cuatro archivos y el proyecto ya se entiende.
3. Trabaja en una rama
El cálculo del total, con su commit bien escrito.
git switch -q -c calcula-el-total cat > total.sh <<'FIN' tail -n +2 "$1" | cut -d, -f3 | paste -sd+ | bc FIN git add total.sh git commit -q -m "Se agrega el calculo del total por bodega Suma la tercera columna del CSV, saltandose la cabecera." bash total.sh bodegas.csv git log --oneline
760 ac5fc3a Se agrega el calculo del total por bodega 1c6ca9e Se agregan el README y la licencia MIT d16ab35 Catalogo inicial de bodegas
Probado antes de fusionar, que es el orden correcto ✅
4. Fusiona dejando rastro
Con --no-ff y limpiando la rama.
git switch -q main
git merge -q --no-ff -m "Entra el calculo del total" calcula-el-total
git branch -d calcula-el-total
git log --oneline --topo-order
git branch
Deleted branch calcula-el-total (was ac5fc3a). c8f9270 Entra el calculo del total ac5fc3a Se agrega el calculo del total por bodega 1c6ca9e Se agregan el README y la licencia MIT d16ab35 Catalogo inicial de bodegas * main
La historia cuenta que hubo una rama y la lista queda limpia 🌿
5. Marca la versión
Una etiqueta anotada para la v1.0.
git tag -a v1.0 -m "Primera version del catalogo" git tag git describe --tags git log --oneline --decorate -1
v1.0 v1.0 c8f9270 (HEAD -> main, tag: v1.0) Entra el calculo del total
Ya se puede decir "la v1.0" y que signifique algo 🏷️
6. Publícalo con sus etiquetas
Recuerda que el push normal no se lleva las etiquetas.
cd .. git init -q --bare catalogo-servidor.git cd catalogo-bodegas git remote add origin ../catalogo-servidor.git git push -q -u origin main git push -q origin --tags git ls-remote origin
c8f9270f3a39746c8bffd44a28cd18bd4f3cbab5 HEAD
c8f9270f3a39746c8bffd44a28cd18bd4f3cbab5 refs/heads/main
6cc816b146b13f45ae2b3a534cb1e1191fa8781a refs/tags/v1.0
c8f9270f3a39746c8bffd44a28cd18bd4f3cbab5 refs/tags/v1.0^{}
La rama y la etiqueta, las dos allá 🚀
7. Haz la revisión final
Lo que miro antes de mandarle un repositorio a alguien.
echo "== que se publica ==" && git ls-files echo "== historia ==" && git log --oneline --topo-order echo "== versiones ==" && git tag echo "== nada suelto ==" && git status --short && echo "limpio"
== que se publica == .gitignore LICENSE README.md bodegas.csv total.sh == historia == c8f9270 Entra el calculo del total ac5fc3a Se agrega el calculo del total por bodega 1c6ca9e Se agregan el README y la licencia MIT d16ab35 Catalogo inicial de bodegas == versiones == v1.0 == nada suelto == limpio
Si esas cuatro cosas se ven bien, el repositorio está listo para enseñarse 🎓
8. Intenta guardar cuando ya no queda nada
Con todo commiteado, prueba a hacer otro commit.
git commit -m "Un commit mas"
On branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean
"nothing to commit, working tree clean" es la frase que quieres ver al terminar un proyecto: significa que no dejaste nada suelto ✅
Lo que te llevas
README, gitignore, licencia, commits legibles, una rama, una versión y una revisión. Eso es un repositorio que habla bien de ti.
Git era el requisito. Esto es para lo que lo querías
Nadie aprende Git por Git. Se aprende porque sin él no puedes trabajar con nadie ni volver atrás cuando algo se rompe, y las dos cosas son la base de construir algo que dure.
Con esto ya puedes entrar a el curso de ingeniería de IA en producción sin que la herramienta te estorbe, que es justo el motivo por el que este libro existe: ahí vas a trabajar sobre un repositorio de verdad durante cuatro semanas, y quien llega sin saber Git se pasa la primera peleándose con el control de versiones en vez de con el sistema.
Y si no vas a ese curso, Git te sirve igual: es la herramienta que te deja volver atrás cuando rompiste algo, y eso vale en cualquier trabajo técnico 🌸
Practica este capítulo 📓
Todo el código de arriba en un cuaderno que corre de principio a fin, y los ejercicios con una celda vacía para que los hagas tú. Se abre en Google Colab de un clic y no hay que instalar nada. Donde veas %%revisa, escribe tu respuesta y el cuaderno te dice si te salió.
¿Prefieres trabajar en tu máquina? Bájate el cuaderno de práctica o el de soluciones. Todos están también en github.com/soymissyera/MissYeraEjercicios.