2012-05-11 22 views
69

Nuestra rama principal a distancia de alguna manera consiguió en mal estado. El código de desarrollo actual está en la rama principal junto con los últimos commits. Obviamente, el código de desarrollo no está listo para la rama principal.Cómo forzar un reinicio empujar al repositorio remoto?

Así que en mi repositorio local, lo hice un restablecimiento a la última etiqueta, git reset --hard (Tag). La rama maestra ahora está correcta en mi repositorio local. Ahora cuando intento para empujar los cambios en el repositorio remoto, git push origin master, me sale 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. 

Así que después de mirar descubrí la opción --force. Así que hice un empuje vigor al repositorio remoto, git push --force origin master, y todavía me da 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 hacer un tirón en maestro, ya que contiene código de desarrollo que no pueden estar en master .

+2

Creo que el mensaje significa que no tiene los derechos para hacer un avance no rápido. – svick

+1

Has tenido razón, gracias. En el archivo de configuración para el repositorio en remoto, 'denyNonFastforwards = true'. Lo cambié a falso, presioné mis cambios y luego lo cambié a verdadero. Gracias de nuevo a todos por la ayuda. – samwell

+2

@samwell por favor, marque la respuesta de svick como aceptada – hultqvist

Respuesta

9

Trate de usar la bandera -f y ponerlo después de que el nombre de la sucursal remota.

git push origin master -f

+0

No, eso tampoco funcionó. También probé 'git push -f origin master' y el mismo resultado. Ambas veces lo probé, recibí la segunda versión del mensaje de error. – samwell

13

El mando a distancia no permite no avanza rápidamente.

Su mejor opción es 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.

+0

Fueron algunas configuraciones en el repositorio remoto las que bloquearon todos los cambios no rápidos. – samwell

111

El mensaje significa que no está permitido hacer un avance sin avance rápido.

su repositorio remoto tiene más probabilidades denyNonFastforwards = true en su configuración. Si cambia eso, git push --force debería funcionar.

Para cambiar el ajuste, es necesario tener acceso a la máquina con el repositorio remoto. Desde allí, haz git config receive.denynonfastforwards false.

+1

¿Puedes hacer un 'git config' para un servidor? O tal vez estabas usando eso metafóricamente. Para jugar con estas ideas creé un repositorio de prueba en '/ opt/git' (mi espacio de 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: branch' funcionó según lo requerido. – HankCa

+4

El mensaje de error tendrá una línea que comienza con "error: no se pudieron enviar algunos refs a " donde 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

+0

@emery pero si alguien no tiene acceso al servidor? – hsalimi

0

El problema ocurre porque la rama actual no está configurada correctamente para PULL. Primero compruebe si la rama ascendente está configurada correctamente para la extracción usando - git remote show origin. Puede encontrarlo en la sección - Ramas locales configuradas para 'git pull':. Si no es así, configurarlo usando:

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

Dale nombre de la rama apropiada para el marcador de posición - MyBranch

+1

No resuelve la prohibición de empuje de avance rápido. –

9

pasos para habilitar de forma permanente empuje vigor en el siguiente estilo

git push -f myrepo my-branch 

Editar la archivo llamado "config" en la carpeta que termina en ".Git "en su repositorio remoto

En la salida de línea de comandos de Git del empuje fallado, busque la línea que dice algo como:

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

continuación

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

Set" denyNonFastforwards "a falso

En" config ", establecer

[receive] 
     denyNonFastforwards = false 

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

git push -f myrepo my-branch 
+0

¿Cómo hacer esto sin tener acceso a SSH para recuperar el git repo? –

+0

¿Quizás use el comando git revert como sugiere richo? Si realiza primero una copia de seguridad del estado actual del repositorio, aún puede fusionar su código al avanzar. – emery

+0

'git revert' es algo complicado cuando tienes fusiones. Para ser más complicado, mi caso tiene 3 fusiones, una de las cuales es con muy antiguo ~ 20 compromiso divergente del desarrollo, 2do es una especie de fusión del maestro - feo como el infierno. –

2

No está permitido hacer git push que no es el avance rápido.

  1. Si la distancia es GitHub, ir a https://github.com/$USER/$REPO/settings/branches y poco proteger a la rama de que se trate.

    enter image description here

    usted tiene que ser administrador de la cesión temporal de hacerlo.

  2. Si el control remoto es su propio servidor git, ejecute allí git config receive.denynonfastforwards false.

+0

Tenga en cuenta que para las instancias de Git Hub Enterprise, las transferencias a la rama predeterminada (generalmente "maestro") 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á hacer empujes forzados a la rama predeterminada. Suponiendo que tiene permisos, puede solucionarlo temporalmente cambiando la rama predeterminada a otra cosa, haciendo su empuje de fuerza y ​​luego regresando. –

Cuestiones relacionadas