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?
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
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
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.
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.
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