Contenido
Fundamentos de Git
Git es un sistema de control de versiones distribuido diseñado para manejar proyectos de cualquier tamaño con velocidad y eficiencia. Fue creado por Linus Torvalds en 2005 para el desarrollo del kernel de Linux.
Conceptos Básicos
- Repositorio: Almacén de archivos de un proyecto y su historial de cambios
- Commit: Instantánea de los cambios realizados en un momento específico
- Rama (Branch): Línea independiente de desarrollo
- Fusión (Merge): Combinación de cambios de diferentes ramas
- Clon: Copia completa de un repositorio
- Pull/Push: Descargar/Subir cambios a un repositorio remoto
Configuración Inicial
# Configurar nombre de usuario
git config --global user.name "Tu Nombre"
# Configurar email
git config --global user.email "tu@email.com"
# Verificar configuración
git config --listComandos Esenciales
Estos son los comandos de Git que utilizarás con más frecuencia en tu flujo de trabajo diario.
| Comando | Descripción |
|---|---|
| git init | Inicializa un nuevo repositorio Git |
| git clone [url] | Clona un repositorio existente |
| git add [archivo] | Añade archivos al área de preparación |
| git commit -m "[mensaje]" | Guarda los cambios en el repositorio |
| git status | Muestra el estado del repositorio |
| git pull | Obtiene cambios del repositorio remoto |
| git push | Envía cambios al repositorio remoto |
Ramas y Fusiones
Las ramas (branches) en Git permiten desarrollar funcionalidades aisladas del código principal. Esto facilita el trabajo en equipo y la organización del desarrollo.
Trabajando con Ramas
# Crear una nueva rama
git branch nueva-funcionalidad
# Cambiar a la nueva rama
git checkout nueva-funcionalidad
# Crear y cambiar a una nueva rama (atajo)
git checkout -b nueva-funcionalidad
# Ver todas las ramas
git branch
# Ver ramas remotas
git branch -r
# Eliminar una rama
git branch -d nombre-ramaFusionando Ramas
La fusión (merge) permite combinar los cambios de una rama con otra.
# Cambiar a la rama destino
git checkout main
# Fusionar la rama con la actual
git merge nueva-funcionalidad
# Fusión con mensaje personalizado
git merge nueva-funcionalidad -m "Fusionando nueva funcionalidad"Resolviendo Conflictos
Los conflictos ocurren cuando Git no puede fusionar automáticamente los cambios porque hay modificaciones en las mismas líneas de código.
# Cuando ocurre un conflicto, Git marca los archivos
# Edita los archivos para resolver los conflictos manualmente
# Después de resolver, marca como resuelto
git add archivo-con-conflicto.js
# Continúa con la fusión
git merge --continue
# O aborta la fusión si es necesario
git merge --abortFlujos de Trabajo
Los flujos de trabajo en Git son patrones recomendados para organizar el desarrollo en equipo. Existen varios modelos que se adaptan a diferentes necesidades.
Flujo de Trabajo Centralizado
Similar a los sistemas de control de versiones centralizados, pero con las ventajas de Git.
- Una rama principal (main/master)
- Todos los desarrolladores trabajan directamente en esta rama
- Ideal para equipos pequeños y proyectos simples
Flujo de Trabajo Feature Branch
Cada nueva funcionalidad se desarrolla en una rama separada.
- Rama principal protegida (main/master)
- Ramas de funcionalidades para cada nueva característica
- Fusión mediante Pull Requests o Merge Requests
- Facilita la revisión de código
Gitflow
Un modelo más estructurado con ramas específicas para diferentes propósitos.
- master: Código en producción
- develop: Código en desarrollo
- feature/: Nuevas funcionalidades
- release/: Preparación para lanzamientos
- hotfix/: Correcciones urgentes en producción
# Iniciar una nueva funcionalidad
git checkout -b feature/nueva-funcionalidad develop
# Finalizar una funcionalidad
git checkout develop
git merge --no-ff feature/nueva-funcionalidad
git branch -d feature/nueva-funcionalidad
# Crear una rama de lanzamiento
git checkout -b release/1.0.0 develop
# Finalizar un lanzamiento
git checkout master
git merge --no-ff release/1.0.0
git tag -a 1.0.0 -m "Versión 1.0.0"
git checkout develop
git merge --no-ff release/1.0.0
git branch -d release/1.0.0GitHub y GitLab
GitHub y GitLab son plataformas de alojamiento para repositorios Git que añaden funcionalidades de colaboración y gestión de proyectos.
Trabajando con Repositorios Remotos
# Clonar un repositorio
git clone https://github.com/usuario/repositorio.git
# Ver repositorios remotos
git remote -v
# Añadir un repositorio remoto
git remote add origin https://github.com/usuario/repositorio.git
# Cambiar la URL del remoto
git remote set-url origin https://github.com/usuario/nuevo-repo.git
# Obtener cambios sin fusionar
git fetch origin
# Obtener cambios y fusionar
git pull origin mainPull Requests / Merge Requests
Las Pull Requests (GitHub) o Merge Requests (GitLab) permiten proponer cambios, revisar código y discutir modificaciones antes de fusionarlas.
- Crea una rama para tu funcionalidad
- Realiza los cambios y haz commits
- Sube la rama al repositorio remoto
- Crea una Pull Request/Merge Request desde la interfaz web
- Discute y revisa los cambios
- Fusiona los cambios cuando estén aprobados
Características Adicionales
- Issues: Seguimiento de tareas, errores y solicitudes
- Wikis: Documentación colaborativa
- Actions/CI/CD: Automatización de pruebas y despliegues
- Projects: Gestión de proyectos con tableros Kanban
- Discussions: Foros para discusiones del proyecto
Técnicas Avanzadas
Git ofrece herramientas avanzadas para gestionar el historial, depurar problemas y optimizar el flujo de trabajo.
Rebase
El rebase permite reorganizar el historial de commits, creando una línea de tiempo más limpia.
# Rebase básico
git checkout feature
git rebase main
# Rebase interactivo
git rebase -i HEAD~3 # Reorganizar los últimos 3 commits⚠️ Nunca hagas rebase de ramas que ya has compartido con otros. Esto reescribe el historial y puede causar problemas.
Cherry-pick
Cherry-pick permite aplicar commits específicos a la rama actual.
# Aplicar un commit específico a la rama actual
git cherry-pick abc123
# Aplicar varios commits
git cherry-pick abc123 def456
# Cherry-pick sin crear un commit
git cherry-pick abc123 --no-commitStash
El stash permite guardar temporalmente cambios sin hacer commit, útil para cambiar de contexto rápidamente.
# Guardar cambios en el stash
git stash
# Guardar con un mensaje
git stash save "Cambios en progreso para la funcionalidad X"
# Ver lista de stashes
git stash list
# Aplicar el último stash
git stash apply
# Aplicar un stash específico
git stash apply stash@{2}
# Aplicar y eliminar el último stash
git stash pop
# Eliminar un stash
git stash drop stash@{1}Bisect
Git bisect ayuda a encontrar el commit que introdujo un error mediante búsqueda binaria.
# Iniciar bisect
git bisect start
# Marcar el commit actual como malo
git bisect bad
# Marcar un commit anterior como bueno
git bisect good abc123
# Git seleccionará commits intermedios para probar
# Después de probar, marcar como bueno o malo
git bisect good # o git bisect bad
# Finalizar bisect
git bisect reset