🌿 2.1 · Git y GitHub: control de versiones profesional

⏱ 6h 00min ⚡ 100 XP 🏅 Practicante 📖 Backend FullStack
"Git no es para 'guardar cambios': es la máquina del tiempo de tu código."

🎯 Objetivo del tema

Al terminar este tema serás capaz de: Al terminar este tema serás capaz de usar Git con soltura para el trabajo individual y en equipo: crear ramas, fusionarlas, resolver conflictos, abrir Pull Requests en GitHub, y seguir un flujo de trabajo profesional (GitFlow simplificado). Tu código tendrá historial, seguridad, y la base para colaborar.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

🗺️ Mapa del tema

En el Tema 1.2 aprendiste los comandos básicos de Git: add, commit, push, pull. Ahora darás el salto al uso PROFESIONAL: ramas para trabajar en paralelo sin romper nada, fusiones controladas, Pull Requests con revisión de código, y resolución de conflictos. Esto es lo que usan las empresas de tecnología todos los días.

1. Por qué las ramas (branches) cambiaron todo

Trabajar en paralelo sin romper el código principal.

2. Los 3 comandos de ramas que usarás el 90% del tiempo

branch, checkout, merge: cómo crear, moverte y fusionar.

3. Conflictos: cómo ocurren y cómo resolverlos

Cuando dos personas editan lo mismo. La parte inevitable del trabajo en equipo.

4. GitHub: Pull Requests y revisión de código

El flujo profesional de trabajo: feature branch → PR → review → merge.

5. Buenas prácticas: commits, mensajes, .gitignore

Lo que separa a un junior de un senior: cómo escribir commits que cuentan historia.

2.1.1 Por qué las ramas cambiaron todo

Sin ramas, todos los cambios van a main. Si algo se rompe, todo el equipo está bloqueado. Las ramas te permiten trabajar AISLADO: cada feature, cada fix, cada experimento vive en su propia rama. Cuando está listo y revisado, se fusiona con main. Es la base del trabajo en equipo moderno.

El flujo mental correcto

Piensa en main como 'la versión que está en producción, que SÍ O SÍ debe funcionar'. Nunca trabajes directo en main. Crea una rama, trabaja ahí, haz commits, y cuando esté listo, fusiónala con main después de revisarla.

📷 Imagen referencial: Flujo de ramas: main siempre estable, develop para integrar, feature/* para trabajo individual.
Tipo de ramaPropósitoVida útil
main / masterCódigo en producción. SIEMPRE estable.Permanente.
developIntegración de features antes de release.Permanente.
feature/nombreUna feature o cambio específico.Temporal (se borra al fusionar).
hotfix/nombreArreglo urgente de producción.Temporal.
release/versionPreparación de un release.Temporal.
⭐ Regla de oro: Regla de oro: la rama main NUNCA se rompe. Si algo llega a main roto, es una emergencia de producción. Trabaja SIEMPRE en una rama, y main solo recibe código revisado y probado.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

2.1.2 Los 3 comandos de ramas

El 90% de tu trabajo con ramas se reduce a 3 comandos. Memorízalos: crean la rama, te mueves a ella, y la fusionas. Todo lo demás es opcional hasta que lo necesites.

# 1. Crear una rama nueva y moverse a ella
git checkout -b feature/login
# (equivalente a: git branch feature/login + git checkout feature/login)

# 2. Trabajar normalmente: editar, git add, git commit
git add .
git commit -m "Agrego formulario de login"

# 3. Subir la rama a GitHub (la primera vez)
git push -u origin feature/login

# 4. Cuando esté lista, fusionar con main (vía PR en GitHub, recomendado)
#    O en local:
git checkout main
git merge feature/login

# 5. Borrar la rama local (ya no la necesitas)
git branch -d feature/login

Flujo básico de rama

⭐ PR > merge local: Hoy en día, la fusión se hace CASI SIEMPRE vía Pull Request en GitHub, no con git merge local. El PR permite revisión de código por otros, CI/CD automático, y trazabilidad de quién fusionó qué.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

2.1.3 Conflictos: cómo ocurren y cómo resolverlos

Un conflicto ocurre cuando dos personas editan la MISMA línea del MISMO archivo en ramas diferentes. Git no puede decidir cuál versión es 'la correcta': te lo pregunta a ti. La primera vez da miedo. Después de la quinta, es rutina.

Cómo se ve un conflicto en el código

# Cuando haces git merge y hay conflicto, Git marca así el archivo:

<<<<<<< HEAD (tu main)
  const saludo = 'Hola mundo';
=======
  const saludo = 'Hello world';
>>>>>>> feature/ingles

# TÚ decides: borra las marcas y deja solo la versión correcta.
# Después:
git add archivo.js
git commit -m "Resuelvo conflicto en saludo"
# Listo.

Marcas de conflicto en el código

Cómo PREVENIR conflictos

  • Trabaja en archivos diferentes cuando sea posible.
  • Sincroniza (git pull) ANTES de empezar a trabajar cada día.
  • Fusiona feature branches a main FRECUENTEMENTE (no acumules cambios).
  • Comunica al equipo en qué archivo estás trabajando.
⭐ Pide ayuda si es muy grande: Si un conflicto es DEMASIADO grande (cientos de líneas enredadas), no lo resuelvas solo. Pide al compañero que revisa contigo. Los conflictos grandes suelen ser síntoma de un problema de diseño: funciones demasiado grandes, o responsabilidades mal repartidas.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

2.1.4 GitHub: Pull Requests y revisión de código

Un Pull Request (PR) es una petición para que tu rama sea fusionada con otra (usualmente main). Es el momento donde OTRO compañero revisa tu código, comenta, sugiere mejoras, y eventualmente lo aprueba. Es el flujo de trabajo profesional estándar desde hace 15 años.

📷 Imagen referencial: Flujo de un Pull Request: crear rama → commits → push → abrir PR → revisión → aprobación → merge.

Cómo abrir un PR en GitHub (paso a paso)

  • 1. Sube tu rama: git push -u origin feature/login
  • 2. Ve a tu repo en github.com. Aparece un banner 'Compare & pull request'. Haz clic.
  • 3. Título descriptivo: 'Agrego login con email y contraseña' (NO 'cambios' ni 'fix').
  • 4. Descripción: qué hace, por qué, capturas si hay UI, referencias a issues (#123).
  • 5. Asigna revisores: al menos 1 compañero del equipo.
  • 6. Espera revisión. Responde comentarios, haz cambios, push de nuevo (el PR se actualiza solo).
  • 7. Cuando recibes aprobación, haces clic en 'Merge pull request'.
  • 8. Borra la rama (GitHub te lo sugiere).
⭐ PRs pequeños > PRs grandes: Un buen PR es PEQUEÑO: < 400 líneas de cambio, una sola responsabilidad, con descripción clara. PRs grandes son imposibles de revisar bien. Si tu feature es grande, divídela en PRs más pequeños.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

2.1.5 Buenas prácticas: commits, mensajes, .gitignore

Lo que separa a un junior de un senior NO son los comandos que conoce, sino CÓMO los usa. Mensajes de commit claros, .gitignore bien configurado, y commits pequeños y frecuentes hacen que tu proyecto sea profesional y tu equipo te respete.

El formato Conventional Commits (estándar de la industria)

# Estructura: <tipo>(<alcance>): <descripción>
# Tipos: feat, fix, docs, style, refactor, test, chore

# Buenos ejemplos:
git commit -m "feat(login): agrego validación de email"
git commit -m "fix(api): corrijo error 500 al crear usuario"
git commit -m "docs(readme): actualizo instrucciones de instalación"
git commit -m "refactor(auth): extraigo lógica a un servicio"

# Malos ejemplos (NUNCA hagas esto):
git commit -m "cambios"
git commit -m "fix"
git commit -m "ya funciona"
git commit -m "asdfasdf"

Conventional Commits: el estándar

.gitignore: lo que NUNCA debe subirse a Git

# .gitignore (en la raíz del proyecto)
node_modules/         # dependencias (se reinstalan con npm install)
.env                  # variables de entorno (claves secretas)
dist/                # build de producción
*.log                # logs
.DS_Store            # macOS
.vscode/             # configuración personal de VS Code
.idea/               # configuración personal de JetBrains
*.tmp
*.bak

Ejemplo de .gitignore para un proyecto Node.js

⭐ Secretos NUNCA en Git: NUNCA subas claves secretas, contraseñas o API keys a Git. Si lo haces, Git guarda el historial PARA SIEMPRE. Cambia la clave INMEDIATAMENTE, y usa .env + .gitignore desde el inicio. Es uno de los errores más graves (y más comunes) de los juniors.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

📚 Contenido ampliado

Material adicional, referencias externas verificadas y ejemplos extendidos.

🤖 AI Mission

La IA puede explicarte un conflicto, pero solo TÚ puedes decidir cómo resolverlo.

Misión: Crea un proyecto nuevo, simula un conflicto real: tú y un compañero (real o ficticio) editan el mismo archivo en ramas diferentes. Intenta fusionar y experimenta el conflicto. Pídele a la IA que te explique PASO A PASO cómo resolverlo. Hazlo tú. Compara lo que la IA te sugirió con lo que hiciste. Anota en tu cuaderno: ¿fue útil la IA? ¿O era más fácil experimentarlo?

Pasos sugeridos

  1. Crea una carpeta 'practica-git' y un repo local: git init.
  2. Crea un archivo README.md con una línea. Commit.
  3. Crea rama A: git checkout -b feature/A. Modifica la línea. Commit.
  4. Vuelve a main. Crea rama B: git checkout -b feature/B. Modifica LA MISMA LÍNEA (diferente texto). Commit.
  5. Fusiona B a main: git checkout main + git merge feature/B. OK.
  6. Intenta fusionar A: git merge feature/A. CONFLICTO.
  7. Abre el archivo. Ve las marcas <<<<<<<, =======, >>>>>>>.
  8. Resuélvelo a mano: borra las marcas, deja el texto final que tú quieras.
  9. git add + git commit. Listo.
  10. Pídele a la IA: 'Tengo este conflicto en Git, ¿cómo lo resuelvo bien? Dame los pasos exactos.'
  11. Compara lo que dijo la IA con lo que hiciste.
  12. Anota: ¿la IA fue precisa? ¿Hubo algo que te confundió más?

📓 Entregable: Captura del conflicto en el código (con las marcas), captura después de resolverlo, y media página de cuaderno con tu reflexión sobre resolver un conflicto vs leer sobre ello.

🚫 Errores típicos de razonamiento

Error 1: Trabajar directamente sobre main sin crear una rama.
Por qué: Si trabajas en main y algo se rompe, TODO el equipo está afectado. Las ramas te dan AISLAMIENTO: rompes algo, solo tu rama está rota. main sigue funcionando. Es la base del trabajo profesional en equipo.
Error 2: Hacer commits con mensajes vagos como 'cambios' o 'fix'.
Por qué: Dentro de 6 meses, cuando veas el historial de Git, no vas a entender QUÉ hiciste ni POR QUÉ. Los mensajes de commit son tu carta a tu yo del futuro. Conventional Commits (feat:, fix:, docs:) son el estándar de la industria y toman 5 segundos más por commit. Es una inversión ridícula con retorno enorme.
Error 3: Subir node_modules o archivos .env a Git.
Por qué: node_modules pesa 200+ MB y se puede regenerar con npm install. .env contiene claves secretas que NUNCA deben ser públicas. Ambos van en .gitignore desde el día 1. Si ya subiste node_modules, bórralo del repo (git rm -r --cached node_modules) y agrégalo al .gitignore.
Error 4: Hacer un mega-commit con 2000 líneas de cambio.
Por qué: Un commit grande es IMPOSIBLE de revisar, IMPOSIBLE de revertir sin perder otros cambios, e IMPOSIBLE de entender. Regla: cada commit debe ser UNA unidad lógica. Si estás arreglando 3 bugs no relacionados, son 3 commits. Si agregas una feature y refactorizas el código viejo, son 2 commits. Commits pequeños y frecuentes.
Error 5: Hacer git push --force a main 'para limpiar'.
Por qué: git push --force reescribe la historia de la rama. Si otros compañeros ya bajaron esos commits, sus repos quedan INCONSISTENTES. Es una de las acciones más destructivas en Git. La única forma segura de hacer force es a una rama TUYA de feature, NUNCA a main. Si necesitas 'limpiar' main, haz un commit nuevo que arregle lo que quieras, nunca reescribas la historia.

🧪 Laboratorio práctico

Las ramas se entienden haciendo, no leyendo.

Laboratorio: Simulación de trabajo en equipo con Git

Objetivo: Simular el flujo de trabajo PROFESIONAL de un equipo: crear ramas por feature, abrir Pull Requests, hacer code review, fusionar, y resolver un conflicto. El resultado: dominio del flujo GitFlow simplificado.

Pasos

  1. Crea un repo 'lab-git-equipo' en GitHub (público, con README).
  2. Clónalo: git clone https://github.com/tu-usuario/lab-git-equipo.git.
  3. Crea la rama develop desde main: git checkout -b develop && git push -u origin develop.
  4. Crea 3 features: feature/header, feature/footer, feature/formulario.
  5. En cada feature: edita un archivo, commit, push.
  6. Abre un PR desde cada feature hacia develop. Asigna como revisor a un compañero real (o a ti mismo en otro navegador).
  7. Fusiona al menos 1 feature vía PR con revisión.
  8. Simula un conflicto: en feature/A y feature/B, ambos modifican la misma línea de styles.css.
  9. Intenta fusionar ambos: tendrás un conflicto. Resuélvelo.
  10. Cierra los PRs. Borra las ramas ya fusionadas.
  11. Verifica que develop y main están actualizados.
  12. Haz commit final con tag: 'v1.0.0'.

📓 Entregable: URL del repo en GitHub, capturas de: 3 PRs abiertos, 1 conflicto resuelto, el grafo de ramas de GitHub mostrando la historia, y el tag v1.0.0 creado.

📓 Tu cuaderno: Anota pseudocódigo, diagramas, errores que encontraste y respuestas a "explica sin código". La escritura manual refuerza tu razonamiento. Tu profesor puede pedirte que subas fotos de páginas específicas.