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>
Asumiendo que tu rama se llama master
tanto aquí como remotamente, y que tu remota se llama origin
podrías hacer:
git reset --hard <commit-hash>
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.
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:
No **haga ningún restablecimiento.
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).
Copiar el hash.
Ejecuta un comando como:
git push --force <remoto> <el-hash>:<la rama remota>
por ejemplo
git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master