🎯 Objetivo del tema
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.
Trabajar en paralelo sin romper el código principal.
branch, checkout, merge: cómo crear, moverte y fusionar.
Cuando dos personas editan lo mismo. La parte inevitable del trabajo en equipo.
El flujo profesional de trabajo: feature branch → PR → review → merge.
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.
| Tipo de rama | Propósito | Vida útil |
|---|---|---|
| main / master | Código en producción. SIEMPRE estable. | Permanente. |
| develop | Integración de features antes de release. | Permanente. |
| feature/nombre | Una feature o cambio específico. | Temporal (se borra al fusionar). |
| hotfix/nombre | Arreglo urgente de producción. | Temporal. |
| release/version | Preparación de un release. | Temporal. |
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/loginFlujo básico de rama
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.
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.
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).
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
*.bakEjemplo de .gitignore para un proyecto Node.js
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
- Crea una carpeta 'practica-git' y un repo local: git init.
- Crea un archivo README.md con una línea. Commit.
- Crea rama A: git checkout -b feature/A. Modifica la línea. Commit.
- Vuelve a main. Crea rama B: git checkout -b feature/B. Modifica LA MISMA LÍNEA (diferente texto). Commit.
- Fusiona B a main: git checkout main + git merge feature/B. OK.
- Intenta fusionar A: git merge feature/A. CONFLICTO.
- Abre el archivo. Ve las marcas <<<<<<<, =======, >>>>>>>.
- Resuélvelo a mano: borra las marcas, deja el texto final que tú quieras.
- git add + git commit. Listo.
- Pídele a la IA: 'Tengo este conflicto en Git, ¿cómo lo resuelvo bien? Dame los pasos exactos.'
- Compara lo que dijo la IA con lo que hiciste.
- 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
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.
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.
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.
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.
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
- Crea un repo 'lab-git-equipo' en GitHub (público, con README).
- Clónalo: git clone https://github.com/tu-usuario/lab-git-equipo.git.
- Crea la rama develop desde main: git checkout -b develop && git push -u origin develop.
- Crea 3 features: feature/header, feature/footer, feature/formulario.
- En cada feature: edita un archivo, commit, push.
- Abre un PR desde cada feature hacia develop. Asigna como revisor a un compañero real (o a ti mismo en otro navegador).
- Fusiona al menos 1 feature vía PR con revisión.
- Simula un conflicto: en feature/A y feature/B, ambos modifican la misma línea de styles.css.
- Intenta fusionar ambos: tendrás un conflicto. Resuélvelo.
- Cierra los PRs. Borra las ramas ya fusionadas.
- Verifica que develop y main están actualizados.
- 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.