¿Cómo forzar un reinicio al repositorio remoto?

94

Nuestra rama maestra remota de alguna manera se estropeó. El código de desarrollo actual está en la rama maestra junto con las últimas confirmaciones. Obviamente, el código de desarrollo no está listo para la rama maestra.

Así que en mi repositorio local, hice un restablecimiento a la última etiqueta, git reset --hard (Tag). La rama maestra ahora es correcta en mi repositorio local. Ahora, cuando intento enviar los cambios al repositorio remoto git push origin master, aparece un error:

To (REMOTE GIT REPOSITORY LOCATION)
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Entonces, después de mirar alrededor, descubrí la --forceopción. Entonces hice un empuje forzado al repositorio remoto git push --force origin master, y todavía recibí un error:

Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To (REMOTE GIT REPOSITORY LOCATION)
 ! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'

No puedo extraer el maestro porque contiene un código de desarrollo que no puede estar en el maestro.

Samwell
fuente
3
Creo que el mensaje significa que no tienes los derechos para hacer un impulso que no sea de avance rápido.
svick
3
Tenías razón, gracias. En el archivo de configuración para el repositorio en el control remoto, denyNonFastforwards = true. Lo cambié a falso, presioné mis cambios y luego lo cambié de nuevo a verdadero. Gracias de nuevo a todos por la ayuda.
samwell
2
@samwell, marque la respuesta de svick como aceptada
hultqvist
@samwell, ¿la respuesta de svick te funcionó o no?
Songo
Para aquellos que necesitan detalles sobre cómo deshabilitar denyNonFastForwards como hizo Samwell, se pueden encontrar más instrucciones aquí: stackoverflow.com/a/43721579/2073804
ron190

Respuestas:

152

El mensaje significa que no está autorizado a hacer push sin avance rápido.

Lo más probable es que denyNonFastforwards = truesu repositorio remoto tenga en su configuración. Si cambia eso, git push --forcedebería funcionar.

Para cambiar la configuración, necesita acceder a la máquina con el repositorio remoto. A partir de ahí, hazlo git config receive.denynonfastforwards false.

svick
fuente
1
¿Puedes hacer algo git configpor un servidor? O quizás lo estabas usando metafóricamente. Para jugar con estas ideas, creé un repositorio de prueba en /opt/git(el espacio de mi servidor git) y luego modifiqué esta configuración en /opt/git/the_repo/the_repo.git/config. Pero una vez hecho el git push --force origin SHA:branchtrabajo según lo requerido.
HankCa
4
El mensaje de error tendrá una línea que comienza con "error: falló al enviar algunas referencias a <su repositorio>" donde <su repositorio> es la ruta que termina en .git, que es un directorio que contiene un archivo llamado "config". Este archivo "config" es donde puede establecer denyNonFastforwards = false
emery
1
El comentario de @emery es valioso. A veces, la carpeta en el servidor tendrá su origen configurado en algo como /srv/git/repo.git. Esta es la configuración que tiene establecido denyNonFastForwards, no la carpeta de la aplicación.
Elijah Lynn
1
@hsalimi Si no tiene acceso al servidor, debe ponerse en contacto con el administrador del servidor y hacer que lo apaguen temporalmente para que pueda forzar el empuje y luego volver a encenderlo. Sin embargo, es poco probable que la mayoría esté en condiciones de hacer esto. Puede ser más común en un entorno interno con su propio equipo de alojamiento.
Elijah Lynn
1
Esto es inicialmente frustrante, pero la belleza de esto es: el control remoto está totalmente protegido de forma predeterminada, y si usted, como desarrollador, está haciendo rebases de manera intencional y correcta, puede anular esta configuración para permitir el comportamiento peligroso. Rebasar es algo que todo usuario de git debería saber cómo hacer, y saber cuándo no hacerlo. doc1 doc2
moodboom
15

El control remoto no permite los avances no rápidos.

Tu mejor opción es hacer git reverttodas las confirmaciones que no deberían estar allí y tener más cuidado en el futuro.

git revert [commit]creará una nueva confirmación que deshace lo que [commit]hizo.

richo
fuente
Fueron algunas configuraciones en el repositorio remoto las que bloquearon todos los cambios que no eran de avance rápido.
samwell
Si hace esto y necesita volver a aplicar confirmaciones, el historial no se elimina en una reversión, solo los cambios de código, y no podrá seleccionar las confirmaciones o fusionarlas
mtpultz
12

Pasos para habilitar permanentemente el empuje forzado en el siguiente estilo

git push -f myrepo my-branch

Edite el archivo llamado "config" en la carpeta que termina en ".git" en su repositorio remoto

En la salida de la línea de comandos de git del envío fallido, busque la línea que dice algo como:

error: failed to push some refs to 'ssh://[email protected]/srv/git/myrepo.git

luego

ssh [email protected]
cd /srv/git/myrepo.git
vi config

Establezca "denyNonFastforwards" en falso

En "config", establezca

[receive]
        denyNonFastforwards = false

Ahora puede enviar desde su máquina local con -f

git push -f myrepo my-branch
esmeril
fuente
¿Cómo hacer esto sin acceso a SSH al repositorio git desnudo?
Vladimir Vukanac
¿Quizás usar el comando git revert como sugiere richo? Si primero hace una copia de seguridad del estado actual del repositorio, aún puede fusionar su código para avanzar.
emery
git revertes un poco complicado cuando tienes fusiones. Para ser más complicado, mi caso tiene 3 fusiones, de las cuales una es con un compromiso muy antiguo de ~ 20 que divergió del desarrollo, el segundo es una especie de fusión de maestro: feo como el infierno.
Vladimir Vukanac
1
Tal vez la solución sea restablecer el estado deseado, hacer una copia de seguridad (alijo), volver a extraer y aplicar la copia de seguridad (alijo).
Vladimir Vukanac
1
mrW, aún puede fusionar la base de código que desea en la parte superior de una base de código revertida / extraída
emery
11

Intente usar la -fbandera y ponerla después del nombre de la rama remota.

git push origin master -f

Chris Ledet
fuente
1
No, eso tampoco funcionó. También probé el git push -f origin mastermismo resultado. Las dos veces que lo probé, obtuve la segunda versión del mensaje de error.
samwell
2

No está permitido hacer git push que no sea de avance rápido.

  1. Si el control remoto es GitHub, vaya https://github.com/$USER/$REPO/settings/branchesy desproteja la rama en cuestión.

    ingrese la descripción de la imagen aquí

    Tienes que ser administrador del repositorio para hacer eso.

  2. Si el control remoto es su propio servidor git, ejecútelo git config receive.denynonfastforwards falseallí.

filiph
fuente
Tenga en cuenta que para las instancias de Git Hub Enterprise, los empujes a la rama predeterminada (generalmente "maestra") se pueden deshabilitar en el nivel de instancia. Esto significa que incluso si "maestro" no está protegido, e incluso si usted es un administrador del sitio, no podrá realizar empujes forzados a la rama predeterminada. Suponiendo que tiene permisos, puede evitar esto temporalmente cambiando la rama predeterminada a otra cosa, haciendo su empuje forzado y luego volviendo a cambiar.
Christopher Hunter
2

La mejor forma de evitar esto es eliminar la rama remota y volver a enviarla:

git push origin master --delete
git push origin master
Danilo Souza Morães
fuente
0

El problema se produce porque la rama actual no está configurada correctamente para PULL . Primero verifique si la rama ascendente está configurada correctamente para la extracción usando - git remote show origin. Lo puede encontrar en la sección - Las secciones locales configurados para 'git pull': . Si no es así, configúrelo usando:

git config branch.MYBRANCH.merge refs/heads/MYBRANCH

Proporcione el nombre de sucursal apropiado para el marcador de posición: MYBRANCH

Sudheesh.MS
fuente
0

Estoy usando este grupo de comandos para restablecer mi repositorio remoto, esto reinicializará su repositorio local y volverá a vincularse con su repositorio remoto y luego forzará las actualizaciones.

Creo que esta forma no funcionará en su caso, pero puede ser útil para otra persona.

vaya a la carpeta de origen y luego ejecute los comandos: tenga en cuenta que https://github.com/*.gites su enlace de repositorio remoto

git init
git remote add origin https://github.com/*.git
git add .
git commit -m "initial commit"
git push origin master -f
git push --set-upstream origin master

**Note: this will clear all your git history on your master branch**

Khaled AbuShqear
fuente
0

Para mí, la pista de @svick apuntó en la dirección correcta. Dado que el servidor git que quería modificar es en realidad mi caja, inicié sesión en él e hice un git config --global receive.denynonfastforwards falsecambio para que todos los repositorios aceptaran un push forzado no ff. No funcionó fuera de la caja. Lo que encontré fue que en la configuración ya estaba receive.denynonfastforwards=trueconfigurado, y no se podía borrar con git config --global --unset receive.denynonfastforwards. Sin vi configembargo, hacer la edición en el repositorio manualmente ( ) funcionó.

jglathe
fuente
0

Resolví eliminando la rama maestra de protegida y también predeterminada, que es un poco más de las reglas de rama proted en la configuración de un repositorio.

dasra khadka
fuente