Introducción
git push sube commits locales a un remoto y actualiza los branches y tags de ese remoto. Es cómo tu trabajo se hace visible a los colaboradores.
Push básico
git push # branch actual a su upstream
git push origin main # explícito
git push -u origin feature/login # establecer upstream y push
El flag -u (o --set-upstream) vincula el branch local con el remoto, así que futuros git push y git pull no necesitan argumentos.
Pusheando tags
Los tags no se pushean por defecto:
git push origin v1.2.3
git push origin --tags # todos los tags
git push --follow-tags # tags alcanzables desde commits pusheados
--follow-tags es el predeterminado más seguro para flujos de release.
Eliminando branches remotos
git push origin --delete feature/login
# equivalentemente
git push origin :feature/login
Force-push de forma segura
Reescribir el historial (rebase, amend, squash) requiere un force push. Siempre prefiere --force-with-lease, que se rehúsa a aplastar refs que se movieron en el servidor:
git push --force-with-lease
git push --force-with-lease=feature/login:abcd1234
Nunca --force ciegamente a un branch compartido como main.
Configurando valores predeterminados de push
git config --global push.default simple # predeterminado desde 2.0
git config --global push.autoSetupRemote true # 2.37+: -u automático
Con push.autoSetupRemote establecido, un git push simple en un nuevo branch crea el branch remoto y los vincula automáticamente.
Qué pasa durante el push
- Git local negocia con el remoto para encontrar commits comunes.
- Empaqueta y sube solo los objetos faltantes.
- El remoto ejecuta los hooks
pre-receiveyupdate. - Si se acepta, las refs se actualizan atómicamente.
- El hook
post-receivese ejecuta (CI, mirroring, etc.).
Pushes atómicos y firmados
--atomic convierte pushes multi-ref en una sola transacción; o todas las refs se actualizan o ninguna lo hace, lo que previene despliegues parciales. --signed envía un certificado de push firmado con GPG que algunos hosts registran para auditoría:
git push --atomic origin main release/1.2
git push --signed origin main
Para sistemas automatizados, la opción --receive-pack te permite especificar un receive-pack alternativo en el servidor, ocasionalmente necesario para hosts con binarios no estándar. Siempre usa git push --dry-run al ejecutar pushes destructivos por primera vez en un script.
Errores comunes
Pushear a main cuando querías un branch de feature, porque olvidaste en qué branch estabas. Ejecuta git status primero. Usar git push --force contra main y reescribir los commits de otras personas; recupera con el reflog del remoto (si tienes acceso por shell) o re-pusheando desde el clon de un compañero. Pushear sin credenciales configuradas y quedar colgado en un prompt de contraseña; configura un asistente de credenciales o clave SSH. Finalmente, pushes grandes pueden fallar al último momento si un hook los rechaza; si es así, el mensaje de rechazo nombra el commit ofensor. Léelo con cuidado en lugar de re-ejecutar ciegamente.