git fetch
Descargar objetos y referencias de otro repositorio
El comando 'git fetch' descarga commits, archivos y referencias de un repositorio remoto a tu repositorio local. Te permite ver en qué han trabajado los demás sin integrar esos cambios en tus ramas locales. A diferencia de 'git pull', fetch es seguro: nunca cambia tu directorio de trabajo ni tu rama actual. Después del fetch puedes revisar los cambios y decidir si integrarlos.
Sinopsis
git fetch [<options>] [<repository> [<refspec>...]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)...]
git fetch --all [<options>]Opciones
Elegir la opción adecuada
Fetch frente a pull
Entender la diferencia clave entre fetch y pull
| Comando | Descarga commits | Actualiza la rama local | Seguro en cualquier momento |
|---|---|---|---|
git fetch | Sí | No: solo las de seguimiento remoto | Sí: nunca cambia el directorio de trabajo |
git pull | Sí | Sí: integra en la actual | Cuidado: puede causar conflictos |
git pull --rebase | Sí | Sí: hace rebase de la actual | Cuidado: reescribe los commits locales |
Opciones de fetch para limpiar
Opciones para mantener ordenado tu repositorio
| Comando | Quita ramas obsoletas | Trae etiquetas | Caso de uso |
|---|---|---|---|
git fetch | No | Algunas (alcanzables) | Actualización normal |
git fetch --prune | Sí | Algunas (alcanzables) | Limpiar ramas borradas |
git fetch --tags | No | Todas las etiquetas | Traer las etiquetas de release |
git fetch --prune --tags | Sí | Todas las etiquetas | Limpiar ramas + traer todas las etiquetas (se conservan las locales) |
Alcance del fetch
Controlar qué se descarga
| Comando | Descarga desde | Ideal para |
|---|---|---|
git fetch | Remoto por defecto (origin) | Uso más habitual |
git fetch origin | Un remoto concreto | Cuando tienes varios remotos |
git fetch --all | Todos los remotos | Sincronizar un fork con upstream |
git fetch origin main | Solo una rama | Descarga mínima |
Ejemplos
Fetch del remoto por defecto
git fetchDescarga los commits nuevos del remoto por defecto (normalmente 'origin') sin integrarlos.
Fetch de un remoto concreto
git fetch originHacer fetch explícitamente del remoto 'origin'.
Fetch de todos los remotos
git fetch --allHacer fetch de todos los remotos configurados a la vez.
Fetch y poda de ramas obsoletas
git fetch --pruneHacer fetch y quitar las ramas de seguimiento remoto que ya no existen en el remoto.
Ejemplos de flujos de trabajo
git fetch originDescargar los cambios remotos sin integrarlos
git log main..origin/mainVer los commits del remoto que no están en tu rama local
git diff main...origin/mainRevisar los cambios de código hechos en el remoto
git merge origin/mainIntegrar cuando estés listo
git remote add upstream <original-repo-url>Añadir el repositorio original como upstream (una sola vez)
git fetch upstreamTraer lo último del repositorio original
git checkout mainCambiarse a tu rama main
git merge upstream/mainIntegrar los cambios de upstream en tu fork
git push origin mainSubir el fork actualizado a tu GitHub
git fetch --pruneHacer fetch y quitar las ramas de seguimiento remoto obsoletas
git branch -vvVer las ramas locales y su estado de seguimiento
git branch -d old-featureBorrar las ramas locales que seguían a remotas borradas
Solución de problemas
fatal: 'origin' does not appear to be a git repository
Causa: No hay ningún remoto llamado 'origin' configurado
Revisa los remotos con 'git remote -v'. Añade uno con 'git remote add origin <url>'
Hice fetch pero mi rama local no se actualizó
Causa: Fetch solo actualiza las ramas de seguimiento remoto, no las locales
¡Es lo esperado! Ejecuta 'git merge origin/main' o 'git pull' para actualizar tu rama local
error: cannot lock ref - unable to update local ref
Causa: Una referencia de seguimiento remoto obsoleta choca con un nombre de rama nuevo (p. ej. 'feature' frente a 'feature/login')
Ejecuta 'git remote prune origin' o 'git fetch --prune' para quitar las referencias obsoletas y vuelve a hacer fetch
Sigo viendo ramas remotas borradas
Causa: Hay que podar las ramas de seguimiento remoto obsoletas
Usa 'git fetch --prune' o 'git remote prune origin'
El fetch es muy lento o descarga demasiado
Causa: Estás trayendo todo el historial cuando solo necesitas los commits recientes
Usa 'git fetch --depth=1' para un fetch superficial, o trae solo una rama concreta
Consejos y trampas
Buenas prácticas
- ✓Haz fetch antes de empezar a trabajar para ver si hay cambios remotos que debas conocer
- ✓Usa --prune a menudo para mantener tu repositorio libre de ramas obsoletas
- ✓Mejor fetch + merge que pull cuando quieras revisar los cambios antes de integrarlos
- ✓Configura 'git config fetch.prune true' para podar siempre al hacer fetch
- ✓Usa 'git fetch --all' cuando trabajes con forks para sincronizar a la vez origin y upstream
Errores comunes
- ✗Esperar que fetch actualice tu directorio de trabajo: solo actualiza las ramas de seguimiento remoto, no tus ramas locales.
- ✗Olvidar hacer merge o rebase tras el fetch: fetch descarga, pero no integra los cambios.
- ✗No usar --prune a menudo, con lo que las ramas de seguimiento remoto obsoletas llenan tu repositorio.
- ✗Confundir fetch con pull: pull = fetch + merge, mientras que fetch es solo el paso de descarga.
Preguntas frecuentes
Fetch descarga commits, pero no cambia tus ramas locales. Pull = fetch + merge (o rebase). Fetch es más seguro porque te deja revisar los cambios antes de integrarlos.
Fetch solo actualiza las ramas de seguimiento remoto (como origin/main), no tus ramas locales. Necesitas hacer merge o rebase para actualizar tu rama local.
Usa 'git log main..origin/main' para ver los commits del remoto que no están en tu rama local, o 'git diff main...origin/main' para ver los cambios de código hechos en el remoto.
Fetch cuando quieras revisar antes los cambios o trabajes en ramas importantes. Pull para actualizaciones rápidas cuando confías en los cambios que llegan.
Usa 'git fetch origin branch-name' para traer solo esa rama. Útil en repositorios grandes donde no necesitas todo.
Quita las ramas de seguimiento remoto que ya no existen en el remoto. Mantiene limpio tu repositorio cuando tus compañeros borran ramas integradas.