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 --force
opció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.
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.Respuestas:
El mensaje significa que no está autorizado a hacer push sin avance rápido.
Lo más probable es que
denyNonFastforwards = true
su repositorio remoto tenga en su configuración. Si cambia eso,git push --force
deberí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
.fuente
git config
por 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 elgit push --force origin SHA:branch
trabajo según lo requerido.El control remoto no permite los avances no rápidos.
Tu mejor opción es hacer
git revert
todas 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.fuente
Pasos para habilitar permanentemente el empuje forzado en el siguiente estilo
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:
luego
Establezca "denyNonFastforwards" en falso
En "config", establezca
Ahora puede enviar desde su máquina local con -f
fuente
git revert
es 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.Intente usar la
-f
bandera y ponerla después del nombre de la rama remota.git push origin master -f
fuente
git push -f origin master
mismo resultado. Las dos veces que lo probé, obtuve la segunda versión del mensaje de error.No está permitido hacer git push que no sea de avance rápido.
Si el control remoto es GitHub, vaya
https://github.com/$USER/$REPO/settings/branches
y desproteja la rama en cuestión.Tienes que ser administrador del repositorio para hacer eso.
Si el control remoto es su propio servidor git, ejecútelo
git config receive.denynonfastforwards false
allí.fuente
La mejor forma de evitar esto es eliminar la rama remota y volver a enviarla:
fuente
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:Proporcione el nombre de sucursal apropiado para el marcador de posición: MYBRANCH
fuente
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/*.git
es su enlace de repositorio remoto**Note: this will clear all your git history on your master branch**
fuente
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 false
cambio 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 estabareceive.denynonfastforwards=true
configurado, y no se podía borrar congit config --global --unset receive.denynonfastforwards
. Sinvi config
embargo, hacer la edición en el repositorio manualmente ( ) funcionó.fuente
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.
fuente