¿Cómo puedo deshacer un `git commit` localmente y en un control remoto después de `git push`?
He realizado git commit
seguido de un git push
. ¿Cómo puedo revertir ese cambio en los repositorios locales y remotos?
$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael [email protected]>
Date: Tue Jun 11 12:24:23 2011 -0700
git reset --hard HEAD~1
git push -f <remote> <branch>
(Ejemplo de empujón: git push -f origin bugfix/bug123
)
Esto deshará la última confirmación y enviará el historial actualizado al control remoto. Debes pasar -f
porque estás reemplazando el historial ascendente en el control remoto.
Editar:
Tenga en cuenta que esto --hard
hará que su confirmación sea inalcanzable (es decir, parecerá eliminada, pero aún puede git show <hash>
hacerlo git log <hash>
si recuerda su hash). Si desea conservar sus cambios, ejecute:
git reset [--mixed] HEAD~1
En este punto, tiene cambios no preparados porque utilizó --mixed
, que es el valor predeterminado.
Es posible que primero desee actualizar el árbol remoto (es decir, eliminar la confirmación):git push -f <remote> <branch>
Como todavía tiene sus cambios localmente, puede crear otra rama y commit
colocarlos allí (y push
como mejor le parezca).
Generalmente, haga una confirmación "inversa", usando:
git revert 364705c
luego envíalo al control remoto como de costumbre:
git push
Esto no eliminará la confirmación: realiza una confirmación adicional que deshace todo lo que hizo la primera confirmación. Cualquier otra cosa no es realmente segura, especialmente cuando los cambios ya se han propagado.
Primero que nada, relájate.
"Nada está bajo nuestro control. Nuestro control es mera ilusión.", "Errar es humano"
Entiendo que sin querer has enviado tu código a remote-master
. ESTO va a estar bien.
1. Al principio, obtenga el SHA-1
valor de la confirmación que está intentando devolver, por ejemplo, confirmación en la rama maestra. ejecuta esto:
git log
Verá un montón de cadenas similares a 'f650a9e398ad9ca606b25513bd4af9fe...' junto con cada una de las confirmaciones. Copie ese número de la confirmación que desea devolver .
2. Ahora, escriba el siguiente comando:
git reset --hard your_that_copied_string_but_without_quote_mark
Deberías ver un mensaje como "HEAD está ahora en ". estás en claro. Lo que acaba de hacer es reflejar ese cambio a nivel local.
3. Ahora, escribe el siguiente comando:
git push -f
deberías ver como
"advertencia: push.default no está configurado; su valor implícito ha cambiado en..... ... Total 0 (delta 0), reutilizado 0 (delta 0)... ...your_branch_name -> master (actualización forzada) ".
Ahora lo tienes todo claro. Verifique el maestro con "git log" nuevamente, su fix_destination_commit debería estar en la parte superior de la lista.
De nada (de antemano ;))
ACTUALIZAR:
Ahora, los cambios que había realizado antes de que comenzaran todo esto ya no existen. Si quieres recuperar ese arduo trabajo, es posible. Gracias a los comandos git reflog y git cherry-pick .
Para eso, sugeriría seguir este blog o esta publicación .