Git reset hard hard y un repositorio remoto


Tenía un repositorio que tenía algunas confirmaciones malas (D, E y F para este ejemplo).

A-B-C-D-E-F maestro y origen/maestro

He modificado el repositorio local específicamente con un git reset --hard. Tomé una rama antes del reinicio, así que ahora tengo un repositorio que se parece a:

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

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

Ahora necesitaba algunas partes de esas malas confirmaciones, así que elegí los bits que necesitaba e hice algunas nuevas confirmaciones, así que ahora tengo lo siguiente localmente:

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

Ahora quiero empujar este estado de cosas para el repo remoto. Sin embargo, cuando intento hacer un git push Git cortésmente me da el cepillo apagado:

$ 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 [email protected]:myrepo.git  
! [remote rejected] master -> master (non-fast forward)  
error: failed to push some refs to '[email protected]:myrepo.git'  

¿Cómo consigo que el repositorio remoto tome el estado actual del repositorio local?

 174
git
Author: BuZZ-dEE, 2009-09-04

4 answers

Si forzar un push no ayuda ("git push --force origin" o "git push --force origin master" debería ser suficiente), podría significar que el servidor remoto está rechazando los push no rápidos ya sea a través de receive.denyNonFastForwards variable de configuración (ver git config manpage para la descripción), o a través de update / pre-receive hook.

Con Git anterior puedes evitar esa restricción eliminando "git push origin :master" (ver el ':' antes del nombre de la rama) y luego recreando "git push origin master" la rama dada.

Si no puedes cambiar esto, entonces la única solución sería en lugar de reescribir el historial a crear un commit revertir cambios en D-E-F :

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

A-B-C-D-E-F                             origin/master
 255
Author: Jakub Narębski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-15 12:46:22

Para complementar la respuesta de Jakub, si tienes acceso al servidor remoto de git en ssh, puedes ir al directorio remoto de git y establecer:

user@remote$ git config receive.denyNonFastforwards false

Luego vuelve a tu repositorio local, intenta de nuevo hacer tu commit 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
 24
Author: Jealie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-19 17:58:59

En lugar de arreglar tu rama "master", es mucho más fácil intercambiarla con tu "deseada-master" renombrando las ramas. Véase https://stackoverflow.com/a/2862606/2321594. De esta manera ni siquiera dejaría ningún rastro de múltiples registros de reversión.

 1
Author: Aidin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:39

Todo el negocio de restablecimiento de git parecía complicarme mucho.

Así que hice algo a lo largo de las líneas para obtener mi carpeta src en el estado que tenía hace unos pocos commits

# reset the local state
git reset <somecommit> --hard 
# copy the relevant part e.g. src (exclude is only needed if you specify .)
tar cvfz /tmp/current.tgz --exclude .git  src
# get the current state of git
git pull
# remove what you don't like anymore
rm -rf src
# restore from the tar file
tar xvfz /tmp/current.tgz
# commit everything back to git
git commit -a
# now you can properly push
git push

De esta manera el estado de las cosas en el src se mantiene en un archivo tar y git se ve obligado a aceptar este estado sin tocar demasiado básicamente el directorio src se reemplaza con el estado que tenía varias confirmaciones hace.

 0
Author: Wolfgang Fahl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-06 21:42:34