198 votos

Git reset --hard y un repositorio remoto

Yo tenía un repositorio de que había algo de mala compromete en (D, E y F, para este ejemplo).

A-B-C-D-E-F master y origin/master

He modificado en el repositorio local específicamente con un git reset duro. Tomé una rama antes de que el restablecimiento así que ahora tengo un repo que parece:

A-B-C master  
     \ D-E-F old_master

A-B-C-D-E-F origin/master

Ahora necesitaba algunas partes de esas malas compromete de modo que me alegre escogido los bits que se necesita y de hecho algunos nuevos commits así que ahora tengo el local siguiente:

A-B-C-G-H master
     \ D-E-F old_master

Ahora quiero llevar este estado de cosas a la repo remoto. Sin embargo, cuando intento hacer un git git push cortésmente me da el cepillo:

$ git push origin +master:master --force  
Total 0 (delta 0), reused 0 (delta 0)  
error: denying non-fast forward refs/heads/master (you should pull first)  
To git@git.example.com:myrepo.git  
! [remote rejected] master -> master (non-fast forward)  
error: failed to push some refs to 'git@git.example.com:myrepo.git'

¿Cómo puedo obtener el control remoto de repo para tomar el actual estado de los locales de la repo?

282voto

Jakub Narębski Puntos 87537

Si forzar un empate que no ayuda ("git push --force origin", o "git push --force origin master" debería ser suficiente), puede significar que el servidor remoto se niega a no avanzar empuja ya sea a través de receive.denyNonFastForwards de configuración variable (ver git config manual para la descripción), o a través de actualización / pre-recibir gancho.

Con mayores Git puede evitar que la restricción mediante la eliminación de "git push origin :master" (ver ':' antes del nombre de la sucursal) y, a continuación, volver a crear "git push origin master" rama determinada.

Si usted no puede cambiar esto, entonces la única solución sería que en lugar de reescribir la historia para crear una comprometerse a revertir los cambios en D-E-F:

A-B-C-D-E-F-[(D-E-F)^-1] maestro

A-B-C-D-E-F origin/master

24voto

Jealie Puntos 1139

Para complementar la respuesta de Jakub, si tiene acceso al servidor remoto git en ssh, se puede entrar en el directorio remoto git y establecer:

 user@remote$ git config receive.denyNonFastforwards false
 

Luego regresa a tu repositorio local vuelva a intentar hacer su compromiso con --force :

 user@local$ git push origin +master:master --force
 

Y finalmente revertir la configuración del servidor en el estado protegido original:

 user@remote$ git config receive.denyNonFastforwards true
 

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X