Subir y bajar cambios
Aprende a sincronizar tu repositorio local con repositorios remotos usando los comandos git push y git pull, y a resolver los problemas comunes que pueden surgir durante este proceso.
Cristian Escalante
Última actualización: 25 de abril de 2025
Subir y bajar cambios
Una vez que has configurado un repositorio remoto, necesitas saber cómo sincronizar tu trabajo local con ese repositorio. En Git, esto se realiza principalmente mediante dos operaciones: subir cambios (push) y bajar cambios (pull). Dominar estos comandos es esencial para trabajar eficientemente en proyectos colaborativos.
Subir cambios con git push
El comando git push
envía tus commits locales a un repositorio remoto, permitiendo que otros colaboradores accedan a tus cambios.
Sintaxis básica
git push <remoto> <rama>
Donde:
<remoto>
es el nombre del repositorio remoto (generalmente "origin")<rama>
es la rama que deseas enviar
Ejemplos comunes
Enviar la rama actual al remoto predeterminado
git push origin main
Este comando envía los commits de tu rama local main
a la rama main
en el repositorio remoto llamado origin
.
Enviar todas las ramas locales
git push --all origin
Enviar tags
git push origin --tags
Establecer la rama upstream y enviar
Si estás trabajando en una nueva rama que aún no existe en el repositorio remoto, puedes establecer la relación de seguimiento (tracking) al mismo tiempo que envías:
git push -u origin feature/nueva-funcionalidad
La opción -u
(o --set-upstream
) configura la rama local para que "siga" a la rama remota. Después de esto, puedes usar simplemente git push
sin argumentos.
Opciones comunes de git push
--force
git push --force origin main
Fuerza el envío incluso si resulta en un push no fast-forward. ¡Usar con extrema precaución! Esto puede sobrescribir cambios en el repositorio remoto y causar pérdida de trabajo.
--force-with-lease
git push --force-with-lease origin main
Una alternativa más segura a --force
. Verifica que no estés sobrescribiendo cambios de otros que no hayas incorporado localmente.
--delete
git push origin --delete feature/obsoleta
Elimina una rama remota.
Bajar cambios del repositorio remoto
Para actualizar tu repositorio local con cambios del repositorio remoto, Git ofrece dos comandos principales: git fetch
y git pull
.
git fetch: Descargar sin integrar
El comando git fetch
descarga los cambios del repositorio remoto, pero no los integra automáticamente en tus ramas locales. Esto te permite revisar los cambios antes de incorporarlos.
git fetch origin
Después de hacer fetch, puedes ver las diferencias:
git diff main origin/main
Y luego decidir si quieres fusionar los cambios:
git merge origin/main
git pull: Descargar e integrar
El comando git pull
es esencialmente una combinación de git fetch
seguido de git merge
o git rebase
. Descarga los cambios del repositorio remoto y los integra automáticamente en tu rama local actual.
Sintaxis básica
git pull <remoto> <rama>
Ejemplos comunes
git pull origin main
Este comando descarga los cambios de la rama main
en el repositorio remoto origin
y los fusiona con tu rama local actual.
Pull con rebase en lugar de merge
git pull --rebase origin main
Esta variante utiliza rebase en lugar de merge para integrar los cambios, lo que puede resultar en un historial más limpio y lineal.
Diferencias entre fetch, pull y push
Comando | Acción | Dirección | Modifica tu repositorio local |
---|---|---|---|
git fetch | Descarga cambios | Remoto → Local | No (solo actualiza referencias remotas) |
git pull | Descarga e integra cambios | Remoto → Local | Sí (fusiona o rebase) |
git push | Envía cambios | Local → Remoto | No |
Flujos de trabajo comunes
Actualizar tu repositorio antes de comenzar a trabajar
git checkout main
git pull origin main
git checkout -b feature/nueva-funcionalidad
# Trabajar en la nueva característica...
Enviar cambios al finalizar una característica
# Asegúrate de que tus cambios están confirmados
git add .
git commit -m "Implementa nueva funcionalidad"
# Actualiza tu rama con los últimos cambios de main
git checkout main
git pull
git checkout feature/nueva-funcionalidad
git rebase main
# Resuelve conflictos si es necesario
# ...
# Envía tus cambios
git push -u origin feature/nueva-funcionalidad
Mantener una rama de característica actualizada
# Estando en tu rama de característica
git fetch origin
git rebase origin/main
# o
git merge origin/main
Problemas comunes y soluciones
Error: "Failed to push some refs"
Problema: El repositorio remoto tiene cambios que no tienes en tu repositorio local.
Solución:
git pull origin main
git push origin main
Error: "Merge conflict"
Problema: Hay conflictos entre tus cambios locales y los cambios remotos.
Solución:
- Resuelve los conflictos manualmente
- Añade los archivos resueltos:
git add <archivos-con-conflictos>
- Completa el merge:
git commit
- Envía los cambios:
git push origin main
Error: "Permission denied"
Problema: No tienes permisos para enviar cambios al repositorio remoto.
Solución:
- Verifica tus credenciales
- Asegúrate de tener acceso de escritura al repositorio
- Configura correctamente la autenticación SSH o HTTPS
Error: "Non-fast-forward updates were rejected"
Problema: Tu historial local ha divergido del historial remoto.
Solución:
- Integra primero los cambios remotos:
git pull origin main
- O, si estás seguro de lo que haces (¡cuidado!):
git push --force-with-lease origin main
Buenas prácticas
1. Pull antes de Push
Siempre actualiza tu repositorio local antes de enviar cambios para minimizar conflictos.
git pull origin main
git push origin main
2. Trabaja en ramas
Desarrolla nuevas características en ramas separadas para no afectar la rama principal.
git checkout -b feature/nueva-funcionalidad
# Trabajo, commits...
git push -u origin feature/nueva-funcionalidad
3. Rebase vs Merge
- Usa
git pull --rebase
para mantener un historial limpio en ramas personales - Usa
git pull
(merge) cuando trabajas en ramas compartidas
4. Evita --force
Evita usar git push --force
en ramas compartidas. Si es absolutamente necesario, usa --force-with-lease
como alternativa más segura.
5. Comunica tus cambios
Usa mensajes de commit descriptivos y documenta cambios importantes para facilitar la colaboración.
6. Sincroniza con frecuencia
Realiza push y pull con frecuencia para minimizar conflictos y mantener a todos actualizados.
Configuraciones útiles
Configurar el comportamiento de pull
# Configurar pull para usar rebase por defecto
git config --global pull.rebase true
# Configurar pull para usar merge por defecto
git config --global pull.rebase false
Configurar push simple
# Solo envía la rama actual a su upstream
git config --global push.default simple
Almacenar credenciales
# Almacenar credenciales HTTPS temporalmente
git config --global credential.helper cache
# Almacenar credenciales HTTPS permanentemente
git config --global credential.helper store
Conclusión
Dominar los comandos git push
y git pull
es fundamental para trabajar eficientemente con repositorios remotos en Git. Estos comandos te permiten compartir tu trabajo con otros y mantenerte actualizado con los cambios del equipo.
Recuerda que la sincronización efectiva requiere una comprensión clara de cómo fluyen los cambios entre repositorios locales y remotos. Con práctica y siguiendo las buenas prácticas, podrás colaborar sin problemas en proyectos de cualquier tamaño.
En la próxima lección, aprenderemos cómo configurar un repositorio remoto desde cero y cómo gestionar múltiples remotos para escenarios más avanzados.