Watch at EaseHistorias. Respuestas. Perspectiva.

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.

Ilustración original: grafo non-fast-forward con base común, tip remoto y tip local.
Ilustración original: grafo non-fast-forward con base común, tip remoto y tip local. Watch at Ease

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.

Ilustración original: flujo de cinco pasos desde resolver el destino hasta aplicar la política.
Ilustración original: flujo de cinco pasos desde resolver el destino hasta aplicar la política. Watch at Ease