Restablecimiento del control remoto a un determinado commit

Quiero descartar todos los cambios realizados después del commit <commit-hash> . Así que lo hice:

git reset --hard <commit-hash>

Ahora quiero hacer lo mismo con mi remoto. ¿Cómo puedo hacerlo? He hecho algunos commits (y pushes) después de <commit-hash> y sólo quiero descartarlos todos. Es que algo salió terriblemente mal en el camino y no quiero que sea peor de lo que ya es ;(

Básicamente quiero rebobinar mi origin/master a <commit-hash>

Solución

Asumiendo que tu rama se llama master tanto aquí como remotamente, y que tu remota se llama origin podrías hacer:

 git reset --hard 
 git push -f origin master

Sin embargo, debe evitar hacer esto si alguien más está trabajando con su repositorio remoto y ha sacado sus cambios. En ese caso, sería mejor revertir los commits que no quiere, y luego empujar de forma normal.

Actualización: usted ha explicado más abajo que otras personas han sacado los cambios que usted ha empujado, así que es mejor crear un nuevo commit que revierta todos esos cambios. Hay una buena explicación de sus opciones para hacer esto en esta respuesta de Jakub Narębski. La opción más conveniente depende de cuántos commits quieras revertir, y qué método tiene más sentido para ti.

Dado que por tu pregunta está claro que ya has usado git reset --hard para restablecer tu rama master, puede que necesites empezar usando git reset --hard ORIG_HEAD para mover tu rama de vuelta a donde estaba antes. (Como siempre con git reset --hard, asegúrate de que git status está limpio, que estás en la rama correcta y que conoces git reflog como herramienta para recuperar commits aparentemente perdidos). También deberías comprobar que ORIG_HEAD apunta al commit correcto, con git show ORIG_HEAD.

Solución de problemas:

¡Si recibes un mensaje como "! [remote rejected] a60f7d85 -> master (pre-receive hook declined)"

entonces tienes que permitir la reescritura del historial de la rama para la rama específica. En BitBucket, por ejemplo, dice "No se permite reescribir el historial de la rama". Hay una casilla de verificación llamada "Permitir la reescritura del historial de la rama" que tiene que marcar.

Comentarios (12)

Utiliza las otras respuestas si no te importa perder los cambios locales. Este método todavía puede arruinar tu remoto si eliges el hash de commit equivocado para volver.

Si sólo quiere que el remoto coincida con un commit que ya está en su rama local:

  1. No **haga ningún restablecimiento.

  2. Usa git log para encontrar el hash del commit que quieres que coincida con el remoto. 2. Usa git log -p para ver los cambios, o git log --graph --all --oneline --decorate para ver un árbol compacto. (Tener esto último como un alias en tu shell es muy práctico).

  3. Copiar el hash.

  4. Ejecuta un comando como:

     git push --force  :

    por ejemplo

     git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
Comentarios (11)

Yo resolví un problema como el tuyo con estos comandos:

git reset --hard  
git push -f  : 
Comentarios (0)