Tecnología · GUÍA PRÁCTICA
¿Git push rechazado por non-fast-forward? Pruebe la referencia remota antes de corregir
El rechazo es una señal de seguridad del grafo, no una orden de forzar. Determine la referencia y su OID, consérvela en una referencia de auditoría y elija merge, rebase o un lease explícito autorizado.

non-fast-forward significa que la rama de destino no es antepasado del commit propuesto. Aceptar ocultaría al menos un commit remoto del historial visible. Primero identifique la referencia exacta y conserve el tip remoto. Antes no use pull ni force a ciegas.
En un repositorio local desechable creamos la base 15c1b740f8f4, el tip remoto ff5235c58d12 y el tip local divergente 220186e6d9a6. Fallaron el push normal y el lease obsoleto; solo funcionó la prueba autorizada ligada al OID actual observado.
La prueba demuestra mecánica, no permiso. La política, protección, reglas de PR y significado de los commits deciden entre integrar o reescribir. Un lease evita pisar cambios no vistos, pero no legitima perder historial.
Resuelva el destino antes de tocar el historial
Registre URL remota, rama actual, upstream, refspec y destino exacto como refs/heads/main.
Use ls-remote --heads y guarde OID y hora. Si no hay línea, deténgase y revise nombre, acceso y tipo; no sustituya una referencia local obsoleta.
Obtenga el tip observado y clasifique el grafo
Haga fetch a una referencia de auditoría y confirme el OID antes de leer los commits exclusivos de ambos lados.
merge-base --is-ancestor devuelve cero si HEAD contiene el tip remoto; otro valor indica atraso o divergencia. Lea ambos lados antes de decidir.
Integre cuando deba conservarse el historial compartido
Según la política, haga merge de la referencia de auditoría o rebase solo de commits locales no publicados. Resuelva, pruebe y revise el grafo antes del push normal.
Evite pull ciego antes de registrar destino y OID: puede ejecutar merge o rebase y cambiar la rama antes de conservar la evidencia.
Use lease explícito solo con reescritura autorizada
Tras aprobación, ligue el push con --force-with-lease=refs/heads/main:<observed-oid>. El lease obsoleto fue rechazado en la prueba.
Después lea el destino y registre OID anterior/nuevo, aprobación y motivo. Si falla el lease, no lo refresque automáticamente: repita la inspección.
