Git y Control de Versiones
🗺️ Mapa de la Lección
⏱ 1 hora🟢 Principiante🎯 Qué aprenderás
- Crear y gestionar repositorios Git
- Hacer commits y trabajar con ramas
- Sincronizar código con repositorios remotos (GitHub/GitLab)
- Resolver conflictos y deshacer cambios
- Aplicar buenas prácticas de versionado
🌍 Para qué te sirve
- Guardar versiones de tu código
- Trabajar en equipo sin conflictos
- Experimentar sin miedo a romper código
- Revertir cambios si algo sale mal
- Colaborar en proyectos open source
- Mantener historial de cambios de proyectos
🎯 ¿Por qué aprender Git?
Git es un sistema de control de versiones que permite rastrear cambios en tu código a lo largo del tiempo. Aunque Git no es específico de Python, es una herramienta esencial para cualquier programador profesional.
Git es fundamental porque:
- Guarda versiones de tu código: puedes volver a cualquier versión anterior
- Trabajo en equipo: múltiples personas pueden trabajar sin conflictos
- Experimentación segura: prueba cambios sin miedo a romper código
- Revertir errores: deshacer cambios si algo sale mal
- Colaboración: trabajar en proyectos open source y profesionales
Sin Git, trabajar en equipo o mantener historial de cambios sería muy difícil.
🌍 Casos reales donde se usa
Git está en prácticamente todos los proyectos profesionales:
- Guardar versiones: Historial completo de cambios en tu código
- Trabajo en equipo: Colaborar sin conflictos
- Experimentar: Probar cambios sin riesgo
- Revertir cambios: Deshacer errores fácilmente
- Colaborar: Proyectos open source y profesionales
- Mantener historial: Ver quién cambió qué y cuándo
Ejemplo real: Cuando trabajas en un proyecto con otros desarrolladores, Git permite que cada uno trabaje en su propia rama y luego combine los cambios sin conflictos.
💡 Concepto base
Git es un sistema de control de versiones que permite rastrear cambios en tu código a lo largo del tiempo. Es como tener un registro detallado de todos los cambios en tu proyecto, permitiéndote "viajar en el tiempo" para ver versiones anteriores o deshacer errores.
Lo genial de Git: Es el estándar de la industria. Casi todos los proyectos profesionales usan Git, y plataformas como GitHub y GitLab lo hacen fácil de usar.
# Comandos básicos de Git
git init # Inicializar repositorio
git add archivo.py # Agregar archivo al staging
git commit -m "Mensaje" # Guardar cambios
git status # Ver estado del repositorio
# Ejemplo de salida de git status
On branch main
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: archivo.py
Git es como tener un libro de recetas con versiones. Cada vez que mejoras la receta de chilaquiles al pastor, guardas una nueva versión. Si la nueva versión no queda bien, puedes volver a la versión anterior. Si trabajas con otros chefs, cada uno puede tener su propia copia del libro y luego combinar sus mejoras. Git hace lo mismo con tu código: guarda versiones, te permite volver atrás, y facilita trabajar en equipo sin conflictos.
Piensa en Git como un "sistema de respaldo inteligente" para tu código. Cada vez que haces un commit, guardas una "foto" de tu proyecto en ese momento. Puedes volver a cualquier foto cuando quieras. Es esencial aprender Git temprano en tu carrera como programador.
Paso a paso
1. Conceptos Fundamentales
Repositorio: Es donde se almacena todo el historial de tu proyecto.
# Crear un nuevo repositorio
git init mi-proyecto
cd mi-proyecto
# Clonar un repositorio existente
git clone https://github.com/usuario/proyecto.git
Commit: Es como guardar un punto de control en tu proyecto. Registra un cambio específico.
# Ver el estado de los archivos
git status
# Agregar archivos al área de staging
git add archivo.py
# Hacer commit con un mensaje descriptivo
git commit -m "Agregar función de cálculo"
2. Flujo de Trabajo Básico
1. Configuración inicial:
# Configurar tu identidad (solo una vez)
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"
# Verificar configuración
git config --list
2. Trabajar en tu código:
# Crear archivo Python
echo "print('Hola mundo')" > hola.py
# Crear archivo de requisitos
echo "requests==2.28.0" > requirements.txt
3. Revisar cambios:
# Ver qué archivos han cambiado
git status
# Ver los cambios específicos
git diff
# Ver cambios en archivos específicos
git diff hola.py
4. Hacer commit:
# Agregar archivos al staging
git add hola.py requirements.txt
# Hacer commit con mensaje descriptivo
git commit -m "Inicializar proyecto con saludo y dependencias"
3. Ramas: Trabajar en Paralelo
Las ramas (branches) te permiten trabajar en nuevas características sin afectar el código principal.
# Crear y cambiar a una nueva rama
git checkout -b nueva-funcionalidad
# Ver todas las ramas
git branch
# Trabajar en la rama
echo "def nueva_funcion():" >> app.py
git add app.py
git commit -m "Implementar nueva funcionalidad"
4. Merge: Unir Cambios
Cuando tu nueva funcionalidad está lista, únela con la versión principal:
# Cambiar a la rama principal
git checkout main
# Unir la rama experimental
git merge nueva-funcionalidad
# Eliminar la rama ya no necesaria
git branch -d nueva-funcionalidad
Trabaja en ramas separadas para cada nueva característica. Esto te permite experimentar sin romper tu código principal.
5. Trabajar con Repositorios Remotos
GitHub/GitLab: El hogar de tu código en la nube.
# Agregar repositorio remoto
git remote add origin https://github.com/tu-usuario/proyecto.git
# Ver repositorios remotos
git remote -v
# Subir cambios al repositorio remoto
git push origin main
# Descargar cambios del repositorio remoto
git pull origin main
6. Comandos Avanzados
Historial y logs:
# Ver historial de commits
git log
# Ver historial con gráfico (muy útil)
git log --graph --oneline
# Ver cambios en un commit específico
git show commit_hash
Deshacer cambios:
# Deshacer último commit (mantener cambios en archivos)
git reset --soft HEAD~1
# Deshacer cambios en archivo específico (restaurar a último commit)
git checkout -- archivo.py
# Sacar archivo del área de staging
git reset HEAD archivo.py
Stash: Guardar cambios temporalmente
# Guardar cambios temporalmente
git stash
# Ver stashes guardados
git stash list
# Recuperar último stash
git stash pop
Errores comunes
1. Hacer commit de archivos sensibles
# ❌ Error común
git add keys.py # Contiene claves API
git commit -m "Subir claves"
# ✅ Correcto
echo "keys.py" >> .gitignore
# Usar variables de entorno en lugar de archivos hardcodeados
Nunca subas secretos a Git: Claves API, contraseñas, tokens. Una vez que están en Git, es muy difícil eliminarlos completamente. Usa .gitignore y variables de entorno.
2. Commit de archivos temporales
# ❌ Error común
git add . # Agrega TODO, incluyendo temporales
git commit -m "Todo"
# ✅ Correcto
# Configurar .gitignore primero
echo "*.pyc" > .gitignore
echo "__pycache__/" >> .gitignore
echo "*.log" >> .gitignore
# O usar git add archivo_especifico.py
3. Merge sin revisión
# ❌ Error común
git merge rama-grande # Sin saber qué trae
# ✅ Correcto
git diff main rama-grande # Revisar cambios antes
git merge rama-grande
Buenas Prácticas
Mensajes de commit
# ✅ Buenos mensajes
git commit -m "Implementar validación de usuarios"
git commit -m "Corregir bug en cálculo de totales"
git commit -m "Actualizar documentación del API"
# ❌ Malos mensajes
git commit -m "cambios"
git commit -m "fix"
git commit -m "listo"
Estructura de commits
# Hacer commits atómicos (una sola tarea lógica por commit)
git add login_form.py
git commit -m "Crear formulario de login"
git add db_connector.py
git commit -m "Configurar conexión a base de datos"
Ignorar archivos
# Crear archivo .gitignore para no subir basura
echo "*.pyc" > .gitignore
echo "__pycache__/" >> .gitignore
echo "*.log" >> .gitignore
echo ".env" >> .gitignore # ¡Nunca subir secretos!
git add .gitignore
git commit -m "Agregar .gitignore"
Ejercicios Prácticos
Ejercicio 1: Flujo Local Completo
Practica el flujo completo de Git localmente:
# 1. Crear repositorio
mkdir proyecto-demo
cd proyecto-demo
git init
# 2. Configurar identidad (si no lo has hecho)
git config user.name "Demo User"
git config user.email "demo@example.com"
# 3. Crear archivo inicial
echo "print('Versión 1.0')" > app.py
git add app.py
git commit -m "Commit inicial: Versión 1.0"
# 4. Crear rama para mejora
git checkout -b mejora-rendimiento
echo "def optimizar(): pass" >> app.py
git add app.py
git commit -m "Agregar función de optimización"
# 5. Volver a main y hacer merge
git checkout main
git merge mejora-rendimiento
git branch -d mejora-rendimiento
# 6. Ver historial
git log --oneline
Ejercicio 2: Configurar .gitignore
Crea un .gitignore apropiado para un proyecto Python:
# Crear .gitignore
cat > .gitignore << EOF
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# Virtual environments
venv/
env/
ENV/
# IDE
.vscode/
.idea/
*.swp
# Logs
*.log
# Environment variables
.env
.env.local
# OS
.DS_Store
Thumbs.db
EOF
git add .gitignore
git commit -m "Agregar .gitignore para proyecto Python"
Checkpoint
Si llegaste aquí, ya puedes...
- ✅ Puedes crear y gestionar repositorios Git
- ✅ Sabes hacer commits con mensajes descriptivos
- ✅ Entiendes cómo trabajar con ramas
- ✅ Puedes hacer merge de ramas
- ✅ Sabes configurar .gitignore para proteger secretos
- ✅ Entiendes el flujo básico de trabajo con Git
- ✅ Estás listo para versionar tus proyectos Python
Recursos Adicionales
Documentación Oficial
Herramientas Recomendadas
- GitHub Desktop: Interfaz gráfica para Git
- GitKraken: Cliente Git visual
- VS Code Git Integration: Integración de Git en el editor
Conceptos Relacionados
- Entornos Virtuales - Siguiente herramienta profesional
- Testing - Integra Git con pruebas
- Empaquetado - Publica tus proyectos