Cómo solucionar el error 'git push rejected non-fast-forward' de forma segura
El Diagnóstico Rápido
El error [rejected - non-fast-forward] o updates were rejected because the remote contains work that you do not have locally ocurre cuando intentas enviar commits locales a una rama remota en Git, pero el servidor remoto contiene commits más recientes que tu rama local no posee.
🔍 El Diagnóstico Rápido
| Síntoma | Causa Raíz | Solución |
|---|---|---|
error: failed to push some refs ... [rejected - non-fast-forward] |
El repositorio remoto tiene commits en la rama que no han sido integrados en tu copia local | Ejecutar git pull --rebase origin <rama> para aplicar los cambios remotos antes del git push |
🚀 Cómo solucionar el error paso a paso
Paso 1: Obtener e integrar las actualizaciones remotas con Rebase
En lugar de realizar un merge convencional que crea un commit de cruce desordenado, utiliza git pull --rebase para colocar tus nuevos commits locales encima del historial remoto actualizado:
# Reemplaza 'main' por el nombre de tu rama (p. ej., dev o feature/login)
git pull --rebase origin main
Si prefieres hacerlo en dos pasos separados para inspeccionar las diferencias antes de fusionar:
git fetch origin
git rebase origin/main
Paso 2: Resolver posibles conflictos de código
Si existen archivos modificados simultáneamente en local y remoto, Git pausará el proceso de rebase. Abre los archivos marcados con conflicto, resuelve las diferencias y ejecuta:
# Marcar los archivos resueltos
git add .
# Continuar el proceso de rebase
git rebase --continue
Paso 3: Enviar tus cambios al servidor remoto
Una vez que tu rama local esté sincronizada y rebasada sobre el último commit remoto, realiza el envío de tus cambios de forma segura:
git push origin main
Si reescribiste commits locales existentes y necesitas actualizar el remoto en una rama de trabajo personal, evita git push --force y utiliza la opción segura:
git push origin main --force-with-lease
Consejo de Prevención
Prácticas de seguridad recomendadas:
- Reglas de protección de ramas (Branch Protection Rules): Configura reglas en GitHub, GitLab o Bitbucket para impedir push directos y forzados en ramas principales como
mainoproduction. - Sincronizar antes de comenzar a programar: Adquiere el hábito de ejecutar
git pull --rebaseogit fetchal inicio de cada jornada de trabajo o antes de crear una nueva rama de características. - Preferir
--force-with-leasesobre--force: La bandera--force-with-leaseverifica si otra persona subió cambios al remoto entre tanto antes de sobrescribir el historial.