git pull
Descargar de otro repositorio o de una rama local e integrar
El comando 'git pull' descarga contenido de un repositorio remoto y lo integra enseguida en tu rama local. En esencia es 'git fetch' seguido de 'git merge' (o de 'git rebase' con la opción --rebase). Es la forma más habitual de sincronizar tu repositorio local con los cambios de los demás. Al ejecutar git pull, Git descarga primero todos los commits nuevos del remoto y después los integra en tu rama actual. Si tu rama solo va por detrás, hace fast-forward; si los dos lados tienen commits nuevos, el Git moderno se detiene y te pide elegir entre merge y rebase (--no-rebase / --rebase, o la opción pull.rebase). Si hay cambios en conflicto, Git se detiene y te pide resolverlos antes de completar el merge.
Sinopsis
git pull [--rebase | --no-rebase] [--ff-only | --ff | --no-ff] [--commit | --no-commit] [--autostash | --no-autostash] [-q | --quiet] [-v | --verbose] [--depth=<depth>] [--prune] [--tags | --no-tags] [--recurse-submodules[=yes|on-demand|no]] [<repository> [<refspec>...]]Opciones
Elegir la opción adecuada
Estrategia de pull: merge o rebase
La decisión clave que afecta a tu historial de commits
| Comando | Crea commit de merge | Estilo de historial | Ideal para |
|---|---|---|---|
git pull | Depende de la configuración (falla si divergen y no está configurado) | Lo fijan pull.rebase / pull.ff | Fast-forward si solo vas por detrás |
git pull --rebase | No | Lineal | Ramas de funcionalidad, historial limpio |
git pull --no-rebase | Sí (si divergen) | Conserva las ramas | Anular la configuración de rebase y forzar merge |
git pull --ff-only | No | Lineal (falla si divergen) | Asegurarse de no hacer merges accidentales |
Opciones de seguridad y control
Opciones para evitar errores y mantener el control
| Comando | Evita | Comportamiento | Cuándo usarla |
|---|---|---|---|
--ff-only | Merges inesperados | Falla si no puede hacer fast-forward | CI/CD, ramas protegidas |
--no-commit | Commit automático | Integra pero se detiene antes del commit | Revisar el merge antes del commit |
--autostash | Errores por directorio de trabajo con cambios | Stash → pull → pop | Sincronización rápida con trabajo sin commit |
--dry-run | Cualquier cambio | Muestra lo que descargaría fetch; sin merge | Ver de antemano las referencias entrantes |
Qué se descarga
Controlar qué referencias e historial se descargan
| Comando | Trae etiquetas | Descarga todo el historial | Caso de uso |
|---|---|---|---|
git pull | Auto (etiquetas seguidas) | Sí | Flujo normal |
--tags | Todas las etiquetas | Sí | Sincronizar versiones publicadas |
--no-tags | No | Sí | Ahorrar ancho de banda, sincronizar solo una rama |
--depth=N | Auto (etiquetas seguidas) | Solo los N últimos commits | Repositorios grandes, builds de CI |
--unshallow | Auto (etiquetas seguidas) | Convierte un clon superficial en completo | Necesitas todo el historial tras un clon superficial |
Gestión de remotos y ramas
Opciones para manejar varios remotos y referencias obsoletas
| Comando | Alcance | Limpia | Escenario |
|---|---|---|---|
git pull origin main | Un solo remoto/rama | No | Pull normal desde origin |
--all | Todos los remotos | No | Sincronizar desde origin + upstream |
--prune | Un solo remoto | Ramas borradas | Quitar referencias de seguimiento obsoletas |
Casos avanzados
Opciones para situaciones complejas o poco habituales
| Comando | Resuelve | Nivel de riesgo | Caso típico |
|---|---|---|---|
--allow-unrelated-histories | Sin ancestro común | Media | Unir dos repositorios separados |
-s <strategy> | Necesidades especiales de merge (no evita conflictos) | Bajo | Forzar un algoritmo de merge concreto |
--recurse-submodules | Submódulos desactualizados | Bajo | Proyectos con submódulos de git |
Ejemplos de flujos de trabajo
git statusComprobar si hay cambios sin commit que puedan chocar
git stashGuardar con stash el trabajo sin commit si hace falta (o usar --autostash)
git pull --rebase origin mainHacer pull con rebase para mantener limpio el historial
git stash popRecuperar el trabajo guardado si lo guardaste antes
git checkout feature-branchCambiarse a tu rama de funcionalidad
git pull --no-rebase origin mainIntegrar el último main en tu rama de funcionalidad (de forma explícita, porque las ramas se han separado)
git push origin feature-branchSubir la rama de funcionalidad actualizada
git fetch originDescargar los cambios remotos sin tocar el directorio de trabajo
git log HEAD..origin/mainVer qué commits vas a traer
git diff HEAD...origin/mainRevisar los cambios hechos en el remoto
git pull origin mainHacer pull cuando estés conforme con los cambios
git pull --no-rebase origin mainIntentar un pull con merge (puede generar conflictos)
git statusVer qué archivos tienen conflictos (marcados como 'both modified')
(edit conflicted files)Abrir los archivos y resolver las marcas de conflicto (<<<<<<<, =======, >>>>>>>)
git add <resolved-files>Preparar los archivos resueltos
git commitCompletar el merge con un commit
git pull --rebase --autostash origin mainGuardar automáticamente los cambios, hacer pull y volver a aplicarlos
Solución de problemas
Your local changes would be overwritten by merge
Causa: Tienes cambios sin commit en archivos que el pull modificaría
Haz commit de tus cambios primero (git add . && git commit), guárdalos con stash (git stash) o usa git pull --rebase --autostash
git stash && git pull && git stash popRefusing to merge unrelated histories
Causa: Los repositorios remoto y local no tienen ningún ancestro común (p. ej., al hacer pull en un repositorio recién inicializado)
Permitir el merge de historiales sin relación, algo habitual al añadir un remoto a un repositorio local existente
git pull --allow-unrelated-histories origin mainConflicto de merge en uno o varios archivos
Causa: Tanto tú como el remoto cambiasteis las mismas líneas de un archivo
Abre los archivos en conflicto, busca las marcas (<<<<<<<, =======, >>>>>>>), edítalos para resolver y luego git add y git commit. O cancela con git merge --abort
git add <resolved-file> && git commitNot possible to fast-forward, aborting
Causa: Usaste --ff-only (o pull.ff=only está configurado), pero tu rama local se ha separado del remoto
Usa rebase en su lugar (git pull --rebase) o permite un commit de merge (git pull --no-rebase)
git pull --rebase origin mainCannot pull with rebase: You have unstaged changes
Causa: Un pull con rebase necesita un árbol de trabajo limpio, y tienes modificaciones sin commit
Haz commit o stash de tus cambios, o usa autostash para gestionarlos automáticamente
git pull --rebase --autostashNo tracking information for the current branch
Causa: Tu rama no está configurada para seguir a una rama remota
Fija la rama upstream de forma explícita o indica el remoto y la rama en el comando pull
git branch --set-upstream-to=origin/main main'origin' does not appear to be a git repository
Causa: No hay ningún remoto llamado 'origin' configurado
Revisa tus remotos con git remote -v y añade origin o usa el nombre de remoto correcto
git remote add origin <url>You have divergent branches and need to specify how to reconcile them
Causa: Los dos lados tienen commits nuevos y no está configurado ni pull.rebase ni pull.ff, así que el Git moderno se niega a adivinar (las versiones 2.27+ anteriores solo avisaban)
Indica merge (--no-rebase) o rebase (--rebase), o configura un valor por defecto con git config pull.rebase
git config --global pull.rebase trueConsejos y trampas
Buenas prácticas
- ✓Revisa siempre git status antes del pull para evitar conflictos con cambios sin commit
- ✓Usa git pull --rebase para mantener un historial limpio y lineal en las ramas de funcionalidad
- ✓Configura pull.rebase=true de forma global si prefieres rebase por defecto: git config --global pull.rebase true
- ✓Haz primero git fetch cuando quieras revisar los cambios antes de integrarlos
- ✓Usa --ff-only cuando quieras asegurarte de no crear commits de merge sin querer
- ✓Configura el seguimiento con git push -u en el primer push para simplificar los pulls futuros
- ✓Usa --autostash cuando tengas cambios sin commit pero necesites hacer pull rápido
- ✓Haz pull de main/master a menudo para evitar merges grandes y complicados más adelante
- ✓Resuelve los conflictos en el momento: nunca dejes tu repositorio en estado de conflicto
- ✓Usa git pull --prune para limpiar las ramas de seguimiento remoto obsoletas
- ✓Plantéate usar git fetch + git merge para tener más control sobre la integración
- ✓Comprueba siempre que estás en la rama correcta antes del pull para no mezclar cambios
Errores comunes
- ✗Hacer pull con cambios sin commit: puede provocar conflictos o fallar por completo. Haz commit o stash de tus cambios antes, o usa --autostash para gestionarlo automáticamente.
- ✗No entender pull frente a fetch: 'git pull' integra automáticamente, lo que puede sorprender. Haz primero 'git fetch' si quieres revisar los cambios antes de integrarlos.
- ✗Usar merge cuando rebase sería más limpio: en las ramas de funcionalidad, 'git pull --rebase' crea un historial lineal más limpio, sin commits de merge innecesarios.
- ✗Ignorar los conflictos de merge: tras un pull con conflictos, tienes que resolverlos y hacer commit. Nunca dejes tu repositorio en estado de conflicto.
- ✗Hacer pull en la rama equivocada: comprueba siempre tu rama actual con 'git status' antes del pull. Traer cambios a main cuando querías hacerlo en una rama de funcionalidad puede dar problemas.
Preguntas frecuentes
git fetch solo descarga los commits nuevos del remoto sin modificar tu directorio de trabajo ni tus ramas locales. git pull hace fetch Y además integra automáticamente (con merge o rebase) esos cambios en tu rama actual. Usa fetch cuando quieras revisar los cambios antes de integrarlos.
Usa --rebase cuando quieras un historial limpio y lineal (sobre todo en ramas de funcionalidad). Reproduce tus commits locales encima de los descargados en lugar de crear un commit de merge. Usa el pull normal (merge) cuando quieras conservar exactamente la historia de cuándo se hicieron los cambios.
El fast-forward ocurre cuando tu rama local no tiene commits nuevos que el remoto no tenga. Git simplemente avanza el puntero de tu rama hasta el remoto, sin necesidad de un commit de merge. Si tienes commits locales, Git debe crear un commit de merge o hacer rebase; y salvo que pases --rebase/--no-rebase o configures pull.rebase, el Git moderno se detiene con «Need to specify how to reconcile divergent branches».
Usa git pull --rebase para reproducir tus commits locales encima de los remotos y obtener un historial lineal. O usa git pull --ff-only, que solo funciona si es posible un fast-forward (falla si tienes commits locales por delante).
Depende. Con un pull por merge, Git lo permite si los commits que llegan no tocan los archivos que modificaste; si no, se niega con «Your local changes ... would be overwritten by merge». Con --rebase, cualquier cambio sin commit bloquea el pull. Lo recomendable: haz commit antes o usa git pull --rebase --autostash para guardar y recuperar tus cambios automáticamente.
Git pausa el merge y marca los archivos en conflicto. Abre cada uno, busca las marcas de conflicto (<<<<<<<, =======, >>>>>>>), edítalo para resolverlo y luego haz git add del archivo y git commit para completar el merge. Usa git merge --abort para cancelar (o, con git pull --rebase, git rebase --continue / git rebase --abort).
Justo después del pull, ejecuta git reset --hard ORIG_HEAD: Git guarda tu punta anterior en ORIG_HEAD en los merges, fast-forwards y rebases. No uses HEAD~1: un fast-forward puede haber traído varios commits. --hard también descarta los cambios sin commit. Si ORIG_HEAD se ha movido desde entonces, encuentra la punta antigua con git reflog.
Normalmente significa que haces pull de la rama o el remoto equivocados. Revisa: git branch -vv para ver la información de seguimiento, git remote -v para comprobar los remotos, y git fetch --all seguido de git log origin/main para ver los commits remotos.
git pull origin main indica explícitamente el remoto y la rama de los que traer cambios. git pull (sin argumentos) usa la rama de seguimiento configurada para tu rama actual. Si no hay seguimiento configurado, aparece un error que te pide indicarlos.
De forma global: git config --global pull.rebase true (para rebase) o git config --global pull.rebase false (para merge). También puedes fijarlo por repositorio sin --global, o por rama con git config branch.<name>.rebase true.