Juan Diego Andrés PRADA··RAMÍREZ Entrar
Lección 2 de 7

Git avanzado y terminal

¿Qué es?

Git es un sistema de control de versiones: un programa que guarda fotos (commits) del estado de tu proyecto a lo largo del tiempo y te deja moverte entre ellas. "Avanzado" aquí significa pasar de add/commit/push a usar ramas, rebase, resolución de conflictos y un flujo de trabajo disciplinado. La terminal es la línea de comandos: una ventana donde escribes órdenes en texto en vez de hacer clic. En un servidor de producción no hay interfaz gráfica, así que la terminal no es opcional.

¿Cómo funciona?

Cada commit es una foto inmutable identificada por un hash (por ejemplo a1b2c3d). Una rama es solo un puntero móvil que apunta a un commit; crearla es instantáneo y barato. Cuando haces commits, el puntero de tu rama avanza. merge une dos ramas creando un commit de unión que conserva ambas historias. rebase reescribe tus commits para que parezcan hechos encima de otra rama, dejando una historia lineal. Git guarda todo localmente en la carpeta oculta .git; push y pull sincronizan con un repositorio remoto (GitHub).

¿Para qué sirve?

Sirve para colaborar sin pisarte con otros, para experimentar sin miedo (si sale mal, borras la rama) y para mantener una historia limpia que cualquiera pueda leer. En este curso es la base del despliegue: nuestro proyecto final se desplegará automáticamente cada vez que llegue código a main. Por eso main tiene que estar siempre limpia y desplegable, y todo trabajo arriesgado ocurre en ramas aparte.

Pieza del despliegue que construye este módulo

Aquí preparamos el repositorio base de la API que dockerizaremos, desplegaremos y monitorearemos en los módulos siguientes. Dejamos main protegida conceptualmente y un flujo de ramas listo para que CI/CD se enganche después.

Paso 1: crea y configura el repositorio

mkdir mi-api && cd mi-api # crea la carpeta del proyecto y entra
git init # inicializa el repositorio (crea .git)
git config user.name "Tu Nombre" # nombre que aparecerá en los commits
git config user.email "tu@correo.com"
git branch -M main # asegura que la rama principal se llame main

Creamos un archivo mínimo y el primer commit:

printf "# Mi API\n\nHerramienta que desplegaremos en este curso.\n" > README.md
git add README.md # mueve el archivo al área de preparación (staging)
git commit -m "chore: primer commit del proyecto"

Un buen mensaje de commit empieza con un tipo (feat, fix, chore, docs) y describe qué cambia y por qué, no el archivo. Esto se llama Conventional Commits y luego permite generar changelogs automáticos.

Paso 2: trabaja en una rama, no en main

git switch -c feat/endpoint-saludo # crea la rama y se cambia a ella
# ...editas el código, agregas un endpoint...
git add . # prepara todos los cambios
git commit -m "feat: agrega endpoint /saludo"
git switch main # vuelves a main intacta
git branch # lista ramas; el * marca la actual

Paso 3: integra con rebase para una historia limpia

git switch feat/endpoint-saludo
git fetch origin # trae los cambios remotos sin mezclarlos
git rebase origin/main # reescribe tus commits encima de main

Si hay un conflicto, Git pausa y te lo dice. Abres el archivo, buscas las marcas <<<<<<<, =======, >>>>>>>, dejas la versión correcta, y luego:

git add archivo-en-conflicto.py # marca el conflicto como resuelto
git rebase --continue # sigue con el resto de commits

Nunca hagas rebase de una rama que ya compartiste y otros usan (como main pública). Reescribir historia que otros ya tienen rompe sus repositorios. Rebase solo tus ramas privadas.

Paso 4: conecta el remoto y sube

git remote add origin git@github.com:tu-usuario/mi-api.git
git push -u origin main # sube main y la enlaza (-u) al remoto
git push origin feat/endpoint-saludo # sube tu rama para abrir un Pull Request

El Pull Request (PR) es donde, en el módulo de CI/CD, se ejecutarán las pruebas automáticas antes de permitir el merge a main.

Comandos de terminal que usarás todo el curso

pwd # muestra en qué carpeta estás (print working directory)
ls -la # lista archivos, incluidos los ocultos
cd ruta/ # cambia de carpeta (change directory)
cat archivo # imprime el contenido de un archivo
grep "texto" archivo # busca una línea que contenga "texto"
chmod +x script.sh # da permiso de ejecución a un script

Tech English: staging area = área de preparación; commit = confirmar un cambio; to checkout / switch = cambiar de rama; upstream = la rama remota que sigue tu rama local.

Ejercicios

  1. Flujo reproducible. Escribe un script bootstrap.sh que, ejecutado en una carpeta vacía, deje un repositorio con main, un primer commit, una rama feat/demo con un segundo commit, y haga rebase de feat/demo sobre main. Debe terminar sin intervención manual y git log --oneline --graph debe mostrar historia lineal. Se evalúa que el script corra de principio a fin sin errores.

  2. Conflicto controlado. Crea dos ramas que modifiquen la misma línea de un archivo, intenta fusionarlas, resuelve el conflicto y deja constancia en un commit. Entrega los comandos exactos en un README reproducible. Se evalúa que otra persona pueda repetir tus pasos y obtener el mismo resultado.

Tu progreso se guarda en este navegador. Inicia sesión para guardarlo en tu cuenta y verlo desde cualquier dispositivo.