¿Cómo eliminar los últimos n commits en Github y localmente?

127

Estoy tratando de eliminar los últimos 2 commits de uno de mis repositorios de GitHub. He tratado como se sugiere aquí : git push -f origin HEAD^^:master. Parece que funciona, ya que se eliminan las dos últimas confirmaciones.

Luego los eliminé de mi repositorio local con git rebase -i HEAD~2. Elimino las líneas que están relacionadas con esas confirmaciones y verifico git logque se eliminen correctamente.

Después de eso, hago algunos cambios en mi repositorio local, realizo una nueva confirmación y presiono a GitHub. El problema es que, en mi cuenta de GitHub, tengo las dos confirmaciones anteriores que he intentado eliminar.

Creo que el problema está en mi repositorio local, porque si clono mi repositorio Github en mi local y hago algunos cambios aquí, cuando presiono una nueva confirmación, esas viejas confirmaciones no se envían a GitHub.

¿Alguna idea?

Ivan Fernandez
fuente

Respuestas:

199

Para eliminar las dos últimas confirmaciones localmente, sugeriría usar:

git reset --hard HEAD^^

Rebase es una operación completamente diferente que no lo ayudará aquí.

KL-7
fuente
23
Si ya ha enviado este cambio a un repositorio remoto. Puedes eliminarlo con git push -f
Ivan Fernandez
¿Puedes generalizar esto para el último n número de confirmaciones?
user_19
66
@ user_19 puedes hacer cosas como git reset --hard HEAD^4o git reset --hard HEAD~4. Sin embargo, las cosas pueden complicarse un poco si su historial contiene fusiones. Puede encontrar más información sobre cómo especificar revisiones en la sección correspondiente aquí .
KL-7
2
Si quisiera eliminar las últimas 7 confirmaciones, ¿entonces? ¿Es necesario poner ^ 7 veces después CABEZA ... por favor me despejar
Gagan Gami
44
@GaganGami, creo que lo harías git reset --hard HEAD~7, pero corrígeme si me equivoco.
Con Antonakos
105

Si desea eliminar las 2 (dos) últimas confirmaciones, hay un comando fácil para hacerlo:

git reset --hard HEAD~2

Puede cambiar el 2número de las últimas confirmaciones que desea eliminar.

Y para llevar este cambio a remoto, debe hacer un a git pushcon el parámetro force ( -f):

git push -f

Sin embargo, no recomiendo hacer ningún gitcomando -fu --hardopciones involucradas si hay nuevas confirmaciones en remoto (Github) después de estas confirmaciones que desea eliminar. En ese caso, siempre use git revert.

Dherik
fuente
¿Se quedan los cambios que hice?
Zuhayer Tahir
@SymfonyUser, no. Cuando hiciste el hardcomando, perdiste estas dos confirmaciones. Si desea guardar los cambios, cree un diffarchivo de estas confirmaciones antes de aplicar el restablecimiento.
Dherik
3
@ZuhayerTahir si quieres simplemente deshacer el cometer durante los últimos 5 compromete a continuación, sólo hacerlo git reset HEAD~5(no utilizar hard). De esta forma obtendrá sus cambios en un estado por etapas (es decir, no comprometido). Para mí ver esta respuesta .
Miel
@Honey Gracias por tu respuesta. Llegué a la misma conclusión.
Zuhayer Tahir
29

Lo siguiente funciona para mi

git reset HEAD~n

Elimina las últimas nconfirmaciones del repositorio local, ya que HEAD^elimina solo una. Si necesita eliminar estos cambios del control remoto, es posible que deba forzar el empuje, ya que estará detrás del control remoto.

git push -f origin <branch>
Sial01
fuente