Clase 16 — Git, GitFlow y Gestión de Configuración
Resumen Ejecutivo
Sesión práctica (Tema 8C) sobre Git y GitFlow. El profesor revisa comandos esenciales de Git desde línea de comandos, explica los flujos de trabajo (centralizado, por características y GitFlow), y demuestra en directo cómo crear ramas, hacer commits, resolver conflictos y etiquetar releases. Se pone en contexto con el concepto de gestión de configuración como práctica DevOps. GitFlow se presenta con sus ventajas, sus críticas actuales y alternativas como GitHub Flow.
Conceptos Clave
- Gestión de configuración: arte de identificar, organizar y controlar las modificaciones del software y sus dependencias. Todos los miembros del equipo participan.
.gitignore: lista de archivos/carpetas que Git omite (ej.node_modules/,.env). Fundamental para no exponer credenciales.- Flujo centralizado: se trabaja directamente sobre
main/master. Válido para proyectos personales. - Flujo por características (Feature Branch): una rama por feature; se mergea a
maincuando está lista. - GitFlow: modelo con ramas
master,develop,feature/*,release/*yhotfix/*. - GitHub Flow: alternativa simplificada a GitFlow, sin rama
develop. Orientada a entrega continua. - Tags/Etiquetas: marcadores de hitos en el repositorio (ej. versiones
1.0). Anotadas (git tag -a) vs. ligeras. - Conflictos de merge: ocurren cuando dos ramas modifican las mismas líneas. Se resuelven eligiendo el código correcto y luego haciendo commit.
Desarrollo del Temario
1. Gestión de Configuración
La gestión de configuración es una práctica clave en DevOps: identificar, organizar y controlar los cambios del software y sus dependencias. En frameworks modernos (Node, Python) las dependencias se declaran en un fichero (package.json, requirements.txt) y no se versionan los binarios.
Regla de oro: nunca subir a un repositorio público credenciales, tokens ni claves de API. El .gitignore es la primera línea de defensa.
2. Comandos Esenciales de Git
# Inicializar repositorio
git init .
# Ver estado del árbol de trabajo
git status
# Alias útiles (buena práctica)
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
# Añadir cambios al índice (staging)
git add . # todos los ficheros
git add src/archivo.js # fichero concreto
# Commit
git commit -m "Mensaje descriptivo"
# Atajo: add + commit en un paso (solo ficheros ya rastreados)
git commit -am "Mensaje"
# Ver diferencias
git diff
# Ver historial de ramas
git log --oneline --graph
# Listar ramas
git branch
⚠️ EXAMEN Conocer los comandos básicos:
git init,git status,git add,git commit,git checkout,git branch,git merge,git diff,git tag.
3. Flujo Centralizado
main ──●──●──●──●──●
- Todo el trabajo va directamente a
main. - Válido para proyectos personales o unipersonales.
- Simple pero no escala bien en equipos.
4. Flujo por Características (Feature Branch Workflow)
# Crear rama de feature
git checkout -b feature/componente-saludo
# Trabajar y hacer commits en la feature
git add .
git commit -m "Añadido componente MiSaludo"
# Integrar en main
git checkout main
git merge feature/componente-saludo
Recomendación en equipo: antes de mergear tu feature a main, trae los cambios de main a tu rama para detectar conflictos en local:
git checkout feature/mi-feature
git merge main # resolver conflictos aquí si los hay
git checkout main
git merge feature/mi-feature
5. GitFlow
⚠️ EXAMEN — El profesor señala explícitamente que GitFlow puede entrar en el examen.
GitFlow es un modelo de ramificación propuesto por Vincent Driessen en 2010. Trabaja con cinco tipos de ramas:
| Rama | Descripción |
|---|---|
master / main |
Versión oficial en producción. Solo recibe merges de release y hotfix. |
develop |
Rama de trabajo diario. Las features se sacan de aquí. |
feature/* |
Una rama por característica. Sale de develop, se mergea a develop. |
release/* |
Preparación de una versión. Sale de develop, se mergea a master y develop. |
hotfix/* |
Corrección urgente en producción. Sale de master, se mergea a master y develop. |
gitGraph
commit id: "init"
branch develop
checkout develop
commit id: "base develop"
branch feature/login
checkout feature/login
commit id: "add login"
checkout develop
merge feature/login id: "merge login"
branch release/1.0
checkout release/1.0
commit id: "fix bug"
checkout main
merge release/1.0 id: "v1.0" tag: "v1.0"
checkout develop
merge release/1.0 id: "sync develop"
checkout main
branch hotfix/1.0.1
checkout hotfix/1.0.1
commit id: "hotfix"
checkout main
merge hotfix/1.0.1 id: "v1.0.1" tag: "v1.0.1"
checkout develop
merge hotfix/1.0.1 id: "sync hotfix"
Flujo típico:
# Iniciar desde main
git checkout -b develop main
# Nueva feature
git checkout -b feature/info-miembros develop
# ... commits ...
git checkout develop
git merge feature/info-miembros
# Release
git checkout -b release/1.0 develop
# ... ajustes finos, bug fixes ...
git checkout main
git merge release/1.0
git tag -a 1.0 -m "Lanzamiento versión inicial"
git checkout develop
git merge release/1.0 # sincronizar correcciones a develop
# Hotfix en producción
git checkout -b hotfix/1.0.1 main
# ... corrección ...
git checkout main
git merge hotfix/1.0.1
git checkout develop
git merge hotfix/1.0.1 # el hotfix también va a develop
6. Etiquetas (Tags)
# Listar etiquetas
git tag
# Etiqueta anotada (recomendada para releases)
git tag -a 1.0 -m "Lanzamiento versión inicial del producto"
# Etiqueta ligera (sin metadatos)
git tag 1.0
Las etiquetas anotadas almacenan nombre del autor, fecha y mensaje. Son el estándar para marcar releases.
⚠️ EXAMEN Diferencia entre etiqueta anotada y ligera. Comando para crearlas.
7. Críticas a GitFlow y Alternativas
El propio autor (Driessen) revisó su propuesta en 2020:
- GitFlow es adecuado para software con versiones explícitas y varios entornos en producción (ej. aplicación de escritorio, librerías).
- Para proyectos web con entrega continua (múltiples deploys al día), GitFlow introduce complejidad innecesaria.
- La alternativa recomendada en contexto DevOps es GitHub Flow:
GitHub Flow (simplificado):
1. Crea una rama con nombre corto y descriptivo desde main.
2. Trabaja y haz commits en esa rama.
3. Abre una Pull Request para revisión.
4. Resuelve los comentarios.
5. Merge a main y elimina la rama.
main ──●────────────────────────●──
\ /
feature/mi-cambio ──●
El consejo final del autor: "Considera tu propio contexto, no odies y decide por ti mismo."
8. Resolución de Conflictos
Un conflicto ocurre cuando dos ramas modifican las mismas líneas del mismo fichero:
Auto-merging src/components/MiSaludo.jsx
CONFLICT (content): Merge conflict in src/components/MiSaludo.jsx
Automatic merge failed; fix conflicts and then commit the result.
Git marca el conflicto en el fichero:
<<<<<<< HEAD
<p>Felicidades</p> {/* lo que había en develop */}
=======
<p>Estoy muy contento</p> {/* lo que traes de tu feature */}
>>>>>>> feature/cambio-saludo
Proceso de resolución:
1. Editar el fichero y elegir (o combinar) el código correcto.
2. Eliminar los marcadores <<<<<<<, =======, >>>>>>>.
3. git add <fichero>.
4. git commit -m "Resolver conflicto en MiSaludo".
Buena práctica: antes de mergear tu feature a develop, trae develop a tu rama local para detectar y resolver conflictos en tu entorno, sin afectar la rama compartida.
Preguntas Tipo Examen
- ⚠️ EXAMEN ¿Qué es GitFlow? Describe sus ramas principales y para qué sirve cada una.
- ⚠️ EXAMEN ¿Cuál es la diferencia entre una etiqueta anotada y una etiqueta ligera en Git?
- ¿Qué es la gestión de configuración y por qué es importante en DevOps?
- ¿Cuándo es apropiado usar GitFlow y cuándo es mejor usar GitHub Flow?
- ¿Qué problema resuelve el fichero
.gitignore? Pon dos ejemplos de contenido típico. - Describe el proceso para resolver un conflicto de merge en Git.
- ¿Qué diferencia hay entre el flujo centralizado y el flujo por características?
- ¿Qué hace el comando
git commit -am "mensaje"? ¿En qué se diferencia degit add . && git commit? - ¿Para qué sirven los hotfix en GitFlow y en qué ramas deben mergearse?
- ¿Qué es una Pull Request y en qué flujo de trabajo se utiliza habitualmente?