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>
629
3
Asumiendo que tu rama se llama
master
tanto aquí como remotamente, y que tu remota se llamaorigin
podrías hacer: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 ramamaster
, puede que necesites empezar usandogit reset --hard ORIG_HEAD
para mover tu rama de vuelta a donde estaba antes. (Como siempre congit reset --hard
, asegúrate de quegit status
está limpio, que estás en la rama correcta y que conocesgit reflog
como herramienta para recuperar commits aparentemente perdidos). También deberías comprobar queORIG_HEAD
apunta al commit correcto, congit 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. Usagit log -p
para ver los cambios, ogit 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:
por ejemplo
Yo resolví un problema como el tuyo con estos comandos: