Esto es lo que hice en mi rama supuestamente estable ...
% git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded alpha-0.3.0 to master.
% git status
# On branch alpha-0.3.0
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits.
#
nothing to commit (working directory clean)
% git push
Fetching remote heads...
refs/
refs/heads/
refs/tags/
refs/remotes/
'refs/heads/master': up-to-date
updating 'refs/heads/alpha-0.3.0'
from cc4b63bebb6e6dd04407f8788938244b78c50285
to 83c9191dea88d146400853af5eb7555f252001b0
done
'refs/heads/unstable': up-to-date
Updating remote server info
Todo eso fue un error como más tarde me di cuenta. Me gustaría deshacer todo este proceso y revertir la rama alpha-0.3.0 a lo que era.
¿Qué tengo que hacer?
Respuestas:
Debe asegurarse de que ningún otro usuario de este repositorio obtenga los cambios incorrectos o intente construir sobre las confirmaciones que desea eliminar porque está a punto de rebobinar el historial.
Entonces necesita 'forzar' empujar la referencia anterior.
o en tu caso
Es posible que haya
receive.denyNonFastForwards
configurado en el repositorio remoto. Si este es el caso, recibirá un error que incluye la frase[remote rejected]
.En este escenario, tendrá que eliminar y volver a crear la rama.
Si esto no funciona, tal vez porque lo ha
receive.denyDeletes
configurado, entonces debe tener acceso directo al repositorio. En el repositorio remoto, debe hacer algo como el siguiente comando de plomería.fuente
git push -f origin last_known_good_commit:branch_name
Creo que también puedes hacer esto:
Esto es muy similar al último método, excepto que no tiene que perder el tiempo en el repositorio remoto.
fuente
--hard
parámetro " ") debería ser la ID de la confirmación a la que desea restablecer su rama.git reset --hard [commit_id]
para que no nos metiéramos con el continuo espacio-tiempo.+
obliga a que se produzca el empuje, de manera similar a-f
(pero ligeramente diferente: stackoverflow.com/a/25937833/1757149 ). Sin ella, si se intentagit push origin alpha-0.3.0
el empuje fallará:Updates were rejected because the tip of your current branch is behind
.git revert
es menos peligroso que algunos de los enfoques sugeridos aquí:Reemplace 35f6af6f77f116ef922e3d75bc80a4a466f92650 con su propio compromiso.
fuente
La solución aceptada (de @charles bailey) es altamente peligrosa si está trabajando en un repositorio compartido.
Como práctica recomendada, todas las confirmaciones enviadas a un repositorio remoto que se comparte deben considerarse "inmutables". Utilice 'git revert' en su lugar: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes
https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things
fuente
Una forma de hacerlo sin perder los cambios que quería:
Luego puede elegir los archivos que desea enviar
fuente
Otra forma de hacer esto:
git push origin --delete <branch_name>
)fuente
Esto revertirá su repositorio al número de confirmación mencionado
fuente
Deshacer confirmaciones múltiples git reset --hard 0ad5a7a6 (Solo proporcione hash SHA1 commit)
Deshacer la última confirmación
git reset --HAD HEAD ~ 1 (se eliminarán los cambios a la última confirmación) git reset --soft HEAD ~ 1 (los cambios a la última confirmación estarán disponibles como modificaciones locales no confirmadas)
fuente
Escenario 1 : si desea deshacer la última confirmación, diga 8123b7e04b3, a continuación se muestra el comando (esto funcionó para mí):
La salida se ve a continuación:
Información adicional: Escenario 2 : en alguna situación, es posible que desee revertir lo que acaba de deshacer (básicamente deshacer el deshacer) a través del comando anterior, luego use el siguiente comando:
Salida:
Más información aquí: https://github.com/blog/2019-how-to-undo-almost-anything-with-git
fuente
Las respuestas existentes son buenas y correctas, sin embargo, ¿qué sucede si necesita deshacer el
push
pero?Use este comando para revertir el cambio a la referencia:
fuente
Si desea ignorar el último commit que acaba de insertar en la rama remota: esto no eliminará el commit sino que simplemente lo ignorará moviendo el puntero git al commit anterior, referido por HEAD ^ o HEAD ^ 1
Pero si ya ha presionado este commit, y otros han retirado la rama. En este caso, reescribir el historial de su sucursal no es deseable y, en su lugar, debe revertir esta confirmación:
fuente