Git moderno: Worktrees, Sparse-Checkout y Mantenimiento
A medida que los repositorios crecen y los flujos de trabajo se vuelven más exigentes, las versiones modernas de Git han introducido herramientas de productividad que resuelven problemas cotidianos: trabajar en varias ramas a la vez sin clones duplicados, clonar monorrepositorios descargando solo lo necesario y optimizar el rendimiento en segundo plano.
1. git worktree: Trabajar en múltiples ramas simultáneamente #
Tradicionalmente, para cambiar de rama debes hacer commit o git stash de tus cambios incompletos. git worktree permite tener múltiples árboles de trabajo vinculados al mismo repositorio local en carpetas separadas del disco.
¿Cuándo es útil? #
- Estás a mitad de una funcionalidad compleja y surge un hotfix urgente en producción.
- Necesitas ejecutar dos ramas a la vez (por ejemplo, frontend y backend o dos versiones en pruebas).
- Ejecutar tests de larga duración en una rama sin bloquear tu terminal principal.
Comandos principales #
-
Añadir un nuevo worktree en otra carpeta para una rama nueva:
1git worktree add ../hotfix-login -b hotfix/login-bug mainEsto crea una carpeta física
../hotfix-logincon el código listo de esa rama, compartiendo la misma base de datos.git. -
Añadir un worktree para una rama existente:
1git worktree add ../review-feature feature/dashboard -
Listar todos los worktrees activos:
1git worktree list -
Eliminar un worktree cuando termines:
1git worktree remove ../hotfix-login
2. Monorrepositorios y clonado parcial: git sparse-checkout #
En proyectos gigantescos o monorrepositorios que contienen decenas de aplicaciones, clonar y descargar todos los archivos ralentiza el equipo y consume disco innecesario.
Clonado parcial (Blobless Clone) #
Descarga todo el historial de commits y árboles pero solo descarga el contenido de los archivos (blobs) a medida que los vas abriendo o editando:
1git clone --filter=blob:none https://github.com/org/monorepo.git
git sparse-checkout: Descargar solo subcarpetas específicas #
Permite que en tu directorio de trabajo solo aparezcan las carpetas en las que realmente trabajas (por ejemplo, solo la app móvil dentro de un monorrepo):
-
Inicializar sparse-checkout en modo cono (recomendado):
1git sparse-checkout init --cone -
Definir qué carpetas deseas tener en disco:
1git sparse-checkout set apps/frontend packages/ui-kitGit ocultará el resto de carpetas del proyecto en tu disco sin romper el historial ni los commits.
-
Desactivar y volver a ver todo el repositorio:
1git sparse-checkout disable
3. git maintenance: Optimización automática en segundo plano #
Con el tiempo, los repositorios acumulan objetos sueltos, referencias viejas y empaquetados pesados. Históricamente se ejecutaba manualmente git gc, pero hoy Git incluye git maintenance para programar tareas periódicas transparentes.
-
Iniciar optimización automática del repositorio actual:
1git maintenance startPrograma tareas en el cron del sistema operativo para prefetching de commits, compilar grafos de commit y optimizar índices sin consumir batería excesiva.
-
Ejecutar una pasada de mantenimiento manual:
1git maintenance run -
Detener el mantenimiento programado:
1git maintenance stop
4. Comparar cambios tras un rebase: git range-diff #
Cuando realizas un git rebase -i o modificas varios commits de una rama y quieres comprobar qué ha cambiado exactamente entre la versión previa y la nueva de la serie de commits:
1git range-diff main feature-antes...feature-despues
Muestra un diff de dos niveles que te indica qué commits se alteraron, se fusionaron o conservaron su contenido.
5. Resumen de configuración para el desarrollador moderno #
Añade estas directivas a tu ~/.gitconfig para disfrutar de la mejor experiencia moderna:
1# Empuja y asocia automáticamente la rama remota en el primer push: 2git config --global push.autoSetupRemote true 3 4# Mejor visualización de conflictos de 3 vías con ancestro común: 5git config --global merge.conflictstyle zdiff3 6 7# Ordena ramas por la última modificada en 'git branch': 8git config --global branch.sort -committerdate 9 10# Memoriza resoluciones de conflictos para no repetirlas en rebases: 11git config --global rerere.enabled true 12 13# Limpia referencias remotas borradas en cada git fetch: 14git config --global fetch.prune true
Resumen del tema
Conceptos clave #
git worktree: permite tener múltiples ramas activas en directorios paralelos simultáneos sin clonar de nuevo ni recurrir astash.git sparse-checkout&--filter=blob:none: gestión eficiente de monorrepositorios descargando exclusivamente los directorios requeridos.git maintenance: mantenimiento periódico automatizado de la base de datos de Git en segundo plano.git range-diff: verificación comparativa entre series de commits antes y después de reescribir la historia.
Qué debes recordar #
Usa git worktree add para atender hotfixes sin interrumpir tu rama actual y configura push.autoSetupRemote true y zdiff3 para un flujo de trabajo moderno y ágil.