HDP115

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.

CE

Cristian Escalante

Última actualización: 25 de abril de 2025

git
control de versiones
desarrollo

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

ComandoAcciónDirecciónModifica tu repositorio local
git fetchDescarga cambiosRemoto → LocalNo (solo actualiza referencias remotas)
git pullDescarga e integra cambiosRemoto → LocalSí (fusiona o rebase)
git pushEnvía cambiosLocal → RemotoNo

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:

  1. Resuelve los conflictos manualmente
  2. Añade los archivos resueltos: git add <archivos-con-conflictos>
  3. Completa el merge: git commit
  4. 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:

  1. Integra primero los cambios remotos: git pull origin main
  2. 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.

¿Qué es un repositorio remoto?
Aprende qué son los repositorios remotos en Git, por qué son...
Configurar un repositorio remoto
Aprende a configurar repositorios remotos en Git, conectar t...
Referencias
Git. Git - git-push Documentation. https://git-scm.com/docs/git-push
Git. Git - git-pull Documentation. https://git-scm.com/docs/git-pull
Scott Chacon and Ben Straub. Pro Git Book - Working with Remotes. https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes

Conceptos Básicos de HTML

Aprende los conceptos básicos de HTML

Conceptos Básicos de CSS

Aprende los conceptos básicos de CSS

Conceptos Básicos de JavaScript

Aprende los conceptos básicos de JavaScript

Conceptos Básicos SQL

Aprende los conceptos básicos de SQL

Conceptos Básicos de Python

Aprende los conceptos básicos de Python

Conceptos Básicos de UML

Aprende los conceptos básicos de UML

Refuerzo Academico de Herramientas de Productividad 2025