¿Cómo puedo deshacer un `git commit` localmente y en un control remoto después de `git push`?

Resuelto michael asked hace 13 años • 8 respuestas

He realizado git commitseguido 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
michael avatar Jun 24 '11 01:06 michael
Aceptado
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 -fporque estás reemplazando el historial ascendente en el control remoto.

Editar:

Tenga en cuenta que esto --hardhará 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 commitcolocarlos allí (y pushcomo mejor le parezca).

Alexander Groß avatar Jun 23 '2011 18:06 Alexander Groß

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.

Amadan avatar Jun 23 '2011 18:06 Amadan

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-1valor 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 .

kmonsoor avatar Jan 05 '2015 16:01 kmonsoor