Es interesante escribir cuando se tocan los límites de una herramienta tan versátil como Git.
La situación era la siguiente, se me arrancó el HEAD de un proyecto y terminé dividiéndolo en varios branch experimentales, pero quería regresar la cabeza a un commit anterior.
Localmente, ésto lo pude hacer, estando parado en master, con
git reset tagname
(también funciona con el SHA del commit, etc.)
Pero al intentar exportarlo
git push numerica master
no me permitía el update por no ser fast-forward >>
Total 0 (delta 0), reused 0 (delta 0) remote: error: denying non-fast-forward refs/heads/master (you should pull first) To ssh://roberto@numerica.cl/opt/impostor.git ! [remote rejected] master -> master (non-fast-forward) error: failed to push some refs to 'ssh://roberto@numerica.cl/opt/impostor.git'
y ésto con todas las variantes:
git push -f numerica master git push --force numerica master git push -f numerica +master:master etc.
(el + era la opción que daba el man page para este caso)
Incluso traté de desconfigurar >>el servidor
git config --system receive.denyNonFastForwards false
pero no hubo caso.
Al final renombré manualmente la referencia en el remoto
git update-ref HEAD 02b4dbfc564ebeb75083dd4856abf1e12ba2ea7f
y en el local
git update-ref refs/remotes/numerica/master 02b4dbfc564ebeb75083dd4856abf1e12ba2ea7f
lo cual creo que no es lo más limpio porque debe dejar cierta memoria basura…
pero al hacer pull están sincronizados
From ssh://numerica.cl/dir/myapp * branch master -> FETCH_HEAD Already up-to-date.
y si hago push a un cambio, pasa
Counting objects: 9, done. Delta compression using up to 4 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (5/5), 402 bytes, done. Total 5 (delta 4), reused 0 (delta 0) To ssh://numerico@numerica.cl/dir/myapp.git 02b4dbf..c6266f4 master -> master
🙂
Hemos revertido el HEAD en local y remoto.
Git está tan bien hecho que, incluso forzándolo así, no da problema.
Crédito >>