git push
Actualizar las referencias remotas junto con sus objetos
El comando 'git push' sube el contenido del repositorio local a un repositorio remoto. Transfiere commits y actualizaciones de ramas (y etiquetas, cuando las pides con --tags o --follow-tags) de tu repositorio local a un remoto, para que tus cambios estén disponibles para los demás. Push es la forma de compartir tu trabajo: tras hacer commit en local, haces push para sincronizarte con el equipo. Por defecto (push.default=simple), git push solo actualiza la rama upstream de la rama actual, que debe existir y llamarse igual, y solo si es un fast-forward (es decir, si la rama remota es un ancestro de tu rama local).
Sinopsis
git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [-f | --force] [-d | --delete] [--prune] [-q | --quiet] [-v | --verbose] [-u | --set-upstream] [-o <string>] [--force-with-lease[=<refname>[:<expect>]] [--force-if-includes]] [--no-verify] [<repository> [<refspec>...]]Opciones
Elegir la opción adecuada
La escalera de seguridad del force push
Cuando tengas que sobrescribir el historial remoto, elige la opción más segura que sirva para tu caso
| Comando | Nivel de riesgo | Comprueba el remoto | Cuándo falla | Caso de uso |
|---|---|---|---|---|
git push | Seguro | ✓ Solo fast-forward | Si el remoto tiene commits nuevos | Flujo diario normal |
git push --force-with-lease --force-if-includes | El forzado más seguro | ✓ Punta remota en el historial local | Si no has integrado los cambios remotos | Tras un rebase cuando otros pueden haber subido |
git push --force-with-lease | Forzado más seguro | ✓ Remoto sin cambios desde el fetch | Si el remoto cambió desde el último fetch | Tras un rebase en una rama personal |
git push --force | Peligroso | ✗ Sobrescribe a ciegas | Nunca (salvo que el servidor lo rechace) | Solo si estás seguro, o en una rama solo tuya |
Qué se sube
Controlar el alcance de lo que envías al remoto
| Comando | Sube | Incluye etiquetas | Uso típico |
|---|---|---|---|
git push origin main | Una sola rama | ✗ | Subir una rama concreta |
git push -u origin branch | Una rama + configura el seguimiento | ✗ | Primer push de una rama nueva |
git push --all | Todas las ramas | ✗ | Sincronizar todas las ramas locales |
git push --tags | Solo etiquetas (sin ramas) | ✓ Todas las etiquetas | Subir las etiquetas de versión |
git push --follow-tags | Rama actual | ✓ Solo las anotadas alcanzables | Subir con las etiquetas de release correspondientes |
git push --mirror | Todo | ✓ Todo | Clon exacto en el remoto (borra las referencias que solo existen en el remoto) |
Salida y respuesta
Ajustar el nivel de detalle y el formato de salida a lo que necesites
| Comando | Nivel de salida | Muestra el progreso | Legible por máquinas | Ideal para |
|---|---|---|---|---|
git push | Normal | Solo en la terminal | ✗ | Uso interactivo normal |
git push --verbose | Detallado | ✓ | ✗ | Depurar problemas de push |
git push --quiet | Solo errores | ✗ | ✗ | Scripts, pipelines de CI |
git push --progress | Normal + progreso forzado | ✓ Siempre | ✗ | Scripts que necesitan el progreso en los logs |
git push --porcelain | Estructurado | ✗ | ✓ Separado por tabuladores | Analizar los resultados del push en scripts |
Seguridad y verificación
Comprobaciones previas al push y opciones de verificación
| Comando | Ejecuta hooks | Verifica | Crea commit | Cuándo usarla |
|---|---|---|---|---|
git push | ✓ pre-push | Lo acepta el remoto | N/A | Flujo normal |
git push --dry-run | ✓ pre-push | Qué pasaría | ✗ Solo vista previa | Antes de push importantes |
git push --atomic | ✓ | Todas las referencias o ninguna | Todo o nada | Subir varias ramas juntas |
git push --no-verify | ✗ Salta el pre-push local (los hooks del servidor se siguen ejecutando) | Lo acepta el remoto | N/A | Emergencia cuando los hooks te bloquean |
git push --signed | ✓ | Firma GPG | Firmado criptográficamente | Repositorios de alta seguridad, demostrar identidad |
Gestión de remotos y ramas
Opciones para gestionar referencias remotas y relaciones entre ramas
| Comando | Acción | Afecta al remoto | Caso de uso |
|---|---|---|---|
git push -u origin branch | Push + fijar el upstream | Añade una rama | Primer push, configura el seguimiento |
git push origin --delete branch | Borrar una rama remota | Elimina una rama | Limpiar ramas ya integradas |
git push --prune | Borrar las ramas remotas que borraste en local (requiere --all o un refspec con comodín) | Elimina ramas | Llevar los borrados al remoto |
git push --repo=<url> | Subir a un remoto concreto | Remoto de destino | Subir a otra URL remota |
Ejemplos de flujos de trabajo
git remote add origin https://github.com/user/repo.gitAñadir la URL del repositorio remoto
git push -u origin mainSubir la rama main y hacer que siga a origin/main
git statusComprobar que estás en la rama correcta y tienes commits para subir
git pushSubir a la rama upstream que se sigue
git checkout featureCambiarse a tu rama de funcionalidad
git rebase mainRebase sobre main (reescribe el historial de commits)
git push --force-with-leaseForzar el push con seguridad: falla si otra persona subió algo
git checkout -b feature/new-loginCrear la rama nueva y cambiarse a ella
git add . && git commit -m "Add new login"Hacer tus cambios y el commit
git push -u origin feature/new-loginSubir y configurar el seguimiento del upstream
git push origin --delete feature/old-branchBorrar la rama remota
git branch -d feature/old-branchBorrar también la rama local
git push --all originSubir todas las ramas de refs/heads/
git push --tags originOpcionalmente, subir también todas las etiquetas
Solución de problemas
! [rejected] main -> main (fetch first) / (non-fast-forward)
Causa: La rama remota tiene commits que tu rama local no tiene. Otra persona subió cambios, o hiciste rebase/amend de commits que ya estaban subidos.
Trae antes los cambios remotos con 'git pull --rebase' o 'git pull --no-rebase', resuelve los conflictos si los hay y vuelve a subir. Fuerza (mejor con '--force-with-lease') solo si estás seguro de que nadie más usa la rama.
git pull --rebase && git pushgit@github.com: Permission denied (publickey)
Causa: Falló la autenticación SSH: no hay ninguna clave cargada o tu clave pública no está añadida a tu cuenta. (La falta de permiso de escritura da otro error, «Permission to ... denied».)
Comprueba que tu clave SSH está añadida a tu cuenta de GitHub/GitLab. Verifícalo con 'ssh -T git@github.com'. Con HTTPS, asegúrate de usar las credenciales correctas.
ssh -T git@github.comfatal: No configured push destination
Causa: El repositorio no tiene ningún remoto configurado. (Si existe un remoto pero la rama no tiene upstream, verás «The current branch ... has no upstream branch».)
Añade un remoto con 'git remote add origin <url>' y luego sube fijando el upstream con 'git push -u origin <branch>'.
git push -u origin mainYour branch is behind 'origin/main'
Causa: La rama remota tiene commits más recientes que tu rama local. Tienes que integrar esos cambios antes de subir.
Descarga los cambios remotos e intégralos con merge o rebase en tu rama local antes de subir.
git pull origin main && git pushrefusing to update checked out branch
Causa: Intentas subir a un repositorio no bare donde esa rama está en checkout. Eso podría dejar su directorio de trabajo en un estado incoherente.
Sube a un repositorio bare, o pide al receptor que antes haga checkout de otra rama. Suele pasar con servidores personales, no con GitHub/GitLab.
git config receive.denyCurrentBranch updateInsteaderror: failed to push some refs to '<remote-url>'
Causa: Error genérico con varias causas posibles: actualizaciones non-fast-forward, fallos de hooks o problemas de permisos. Mira el mensaje de error detallado encima de esta línea.
Lee toda la salida de error. Normalmente es un problema de non-fast-forward (haz pull antes) o un fallo del hook pre-push (arregla lo que indique el hook).
git pull --rebase && git pushFalló el hook pre-push
Causa: Un hook pre-push (tests, lint, etc.) encontró problemas y bloqueó el push.
Arregla los problemas que indica el hook. Sáltatelo con '--no-verify' solo si es absolutamente necesario y entiendes las consecuencias.
git push --no-verifyremote: Repository not found
Causa: La URL del repositorio es incorrecta, el repositorio se borró o se renombró, o no tienes acceso a él.
Comprueba la URL del repositorio con 'git remote -v'. Verifica que el repositorio existe y que tienes acceso. Actualiza la URL si hace falta.
git remote set-url origin https://github.com/user/correct-repo.gitConsejos y trampas
Buenas prácticas
- ✓Haz siempre pull antes del push: ejecuta 'git pull' (o 'git fetch' seguido de merge o rebase) antes de subir para tener los últimos cambios remotos y evitar pushes rechazados.
- ✓Usa --force-with-lease en lugar de --force: si tienes que forzar, --force-with-lease es más seguro porque falla si otra persona subió al remoto desde tu último fetch (añade --force-if-includes para más seguridad).
- ✓Fija el upstream en el primer push: usa 'git push -u origin branch-name' al subir una rama nueva para configurar el seguimiento. Después te basta con 'git push'.
- ✓Nunca hagas force push a ramas compartidas: forzar en main, master o develop puede destruir el trabajo de otros. Usa commits de revert en lugar de reescribir el historial.
- ✓Usa reglas de protección de ramas: configura tu repositorio para impedir los force push en ramas importantes y exigir revisiones de pull requests.
- ✓Sube a menudo para respaldar tu trabajo: los push frecuentes de las ramas de funcionalidad sirven de copia de seguridad y dejan ver tu avance.
- ✓Comprueba antes de subir: usa 'git push --dry-run' para ver qué se subiría sin subir nada. Ideal para verificarlo dos veces.
- ✓Limpia las ramas remotas: borra las ramas de funcionalidad ya integradas con 'git push origin --delete branch-name' para mantener ordenado el remoto.
- ✓Usa push atómicos para cambios relacionados: al subir varias ramas que dependen entre sí, usa '--atomic' para que o se suban todas o ninguna.
- ✓Firma los push importantes: en repositorios críticos, usa '--signed' para firmar tus push con GPG y poder verificarlos (el servidor debe admitir push firmados; si no, el push falla).
Errores comunes
- ✗Hacer push sin hacer pull antes: si el remoto tiene commits nuevos, tu push será rechazado. Haz siempre 'git pull' (o fetch y luego merge/rebase) primero para incorporar los cambios remotos.
- ✗Usar --force en ramas compartidas: forzar reescribe el historial y puede destruir el trabajo de otros. Usa --force-with-lease o, mejor aún, evita por completo el force push en ramas compartidas.
- ✗Olvidar fijar el upstream con -u: en el primer push de una rama nueva, usa 'git push -u origin branch-name' para configurar el seguimiento. Si no, tendrás que indicar el remoto y la rama cada vez.
- ✗Subir a la rama equivocada: comprueba tu rama actual con 'git branch' antes del push. Usa una sintaxis explícita como 'git push origin feature:feature' para ir sobre seguro.
- ✗No entender los push rechazados: los errores «non-fast-forward» significan que el remoto tiene commits que no tienes en local. Haz pull y merge/rebase antes de subir; no fuerces sin más.
Preguntas frecuentes
'git push' sube tus commits locales a un repositorio remoto para que tus cambios estén disponibles para los demás. 'git pull' descarga commits de un remoto y los integra en tu rama local. Push envía datos; pull los trae.
Un push no se puede «deshacer» de verdad, porque ya es historial compartido. Para revertirlo con seguridad, usa 'git revert HEAD' para crear un commit nuevo que deshaga los cambios y vuelve a subir. Evita 'git reset' + force push en ramas compartidas, porque reescribe un historial que otros quizá ya descargaron.
La opción -u crea una relación de seguimiento entre tu rama local y la rama remota. Tras 'git push -u origin feature', puedes usar simplemente 'git push' y 'git pull' sin indicar el remoto y la rama cada vez.
El force push (--force) solo debe usarse en ramas donde eres la única persona que contribuye, como tus ramas de funcionalidad tras un rebase. Nunca fuerces en ramas compartidas como main o develop. Si no queda otra, usa --force-with-lease por seguridad.
Usa la sintaxis refspec: 'git push origin local-branch:remote-branch'. Por ejemplo, 'git push origin feature:experiment' sube tu rama local 'feature' a una rama remota llamada 'experiment'.
Normalmente porque el remoto tiene commits que no tienes en local (non-fast-forward). Ejecuta 'git pull' para traer e integrar esos cambios, resuelve los conflictos si los hay y vuelve a subir. No fuerces salvo que estés seguro de que no hay riesgo.
Usa 'git push --all origin' para subir todas las ramas locales al remoto. Las etiquetas necesitan otro comando, porque '--all' y '--tags' no se pueden combinar: 'git push --tags origin'.
'--force' sobrescribe a ciegas la rama remota sin mirar su estado. '--force-with-lease' solo sobrescribe si el remoto no ha cambiado desde tu último fetch: falla si otra persona subió algo, y así protege su trabajo. Ojo: un fetch (incluso uno en segundo plano de tu IDE) refresca esa comprobación, así que añade --force-if-includes para exigir además que hayas integrado lo que descargaste.
Usa 'git push origin --delete branch-name' o la forma corta 'git push origin :branch-name'. Ambas eliminan la rama del repositorio remoto.
'git push' a secas solo funciona si la rama actual tiene configurada una rama upstream. Para ramas nuevas, primero necesitas 'git push -u origin branch-name'. Revisa las relaciones de seguimiento con 'git branch -vv'.