2009-10-23 17 views
313

Hice un 'git commit' pero no he presionado a otros. así que cuando hago 'git status', obtengo '# Su bifurcación está por delante de' master 'en 1 commit.'Eliminar un commit de git que no ha presionado

así que si quiero hacer retroceder mi top comprometerse, ¿puedo hacerlo"

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316 

dado que cuando lo hago 'git log'

 
commit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316 
Date: Tue Sep 29 11:21:41 2009 -0700 


commit db0c078d5286b837532ff5e276dcf91885df2296 
Date: Tue Sep 22 10:31:37 2009 -0700
+6

Esta pregunta parece ser un duplicado de otra de sus propias preguntas: http://stackoverflow.com/questions/1338728/how -to-delete-a-git-commit –

+0

Posible duplicado de [Eliminar confirmaciones de una sucursal en Git] (https://stackoverflow.com/questions/1338728/delete-commits-from-a-branch-in-git) –

+0

Posible duplicado de [¿Cómo revertir el repositorio de Git a una confirmación previa?] (Https://stackoverflow.com/questions/4114095/how-to-revert-git-repository-to-a-previous-commit) –

Respuesta

306

En realidad, cuando se utiliza git reset, debe consultar la confirmación que está restableciendo a; por lo tanto, le recomendamos db0c078 confirmar, probablemente.

Una versión más fácil sería git reset --hard HEAD^, para restablecer a la confirmación anterior antes de la cabeza actual; de esa forma no es necesario que esté copiando los ID de los commits.

Tenga cuidado cuando haga cualquier git reset --hard, ya que puede perder cualquier cambio no confirmado que tenga. Es posible que desee comprobar git status para asegurarse de que su copia de trabajo está limpia, o que desea deshacerse de los cambios que están allí.

Además, en lugar de la cabeza se puede utilizar como referencia origin/master, según lo sugerido por @bdonlan en los comentarios: git reset --hard origin/master

+223

O 'git reset --hard origen/master', para restablecerlo a cualquiera que sea el origen. – bdonlan

+0

Sí, eso también es útil. –

+1

Otro puntero útil que puede restablecer es ORIG \ _HEAD o su generalización utilizando reflog HEAD @ {1} (la última posición de HEAD). –

267

si no se ha presionado a los cambios remota

git reset HEAD~1 

Comprobar si la copia de trabajo está limpia por git status.

otra cosa que haya empujado a sus cambios a distancia

git revert HEAD 

Este comando revertirá/eliminar el último commit/cambio y entonces usted puede empujar

+11

Responde a "Eliminar la última confirmación de git que no se ha enviado" (la respuesta más cercana en mi humilde opinión) –

+9

Además, mantiene los cambios locales realizados en la última confirmación, mientras que git reset --hard no hace –

103
git reset --hard origin/master 

para restablecerlo a lo el origen estaba en.

Esto fue publicado por @bdonlan en el comments. Agregué esta respuesta para las personas que no leen comentarios.

+2

Esta pregunta se hizo casi 5 Hace años, y esto ya está en uno de los comentarios. –

+1

¿Qué pasa si la rama local actual difiere de 'master' - ¿Debería usar' origin/mybranch' entonces? –

+0

¡Gracias por compartir! Este es el único que funcionó para mí. – Hajjat

11

He experimentado la misma situación que hice a continuación, ya que es mucho más fácil. Al pasar commit-Id se puede llegar a la confirmación en concreto quiere ir:

git reset --hard {commit-id} 

Como desea eliminar su última confirmación por lo que necesita para pasar el commit-Id donde tiene que mover el puntero:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296 
+0

Solo una advertencia para los novatos como yo: haga una copia de seguridad de los archivos en los que desea MANTENER los cambios, ya que se revertirán a la versión anterior. Mi hipótesis fue que, accidentalmente, puse un volcado de base de datos en mi directorio repo y luego me comprometí. Obviamente, no quería enviar esos archivos al repositorio, pero quería mantener los cambios que había realizado en otros archivos. Así que tuve que copiar y pegar los cambios necesarios de la copia de seguridad que hice ANTES de hacer el reinicio de git. – user1063287

0

Una forma sería eliminar la sucursal local y finalizar esa bifurcación desde el servidor si su sucursal local está por delante de la remota por varias confirmaciones y debe confirmarlas todas.

0

Esto es lo que hago:

primer pago y envío su sucursal (por mi caso master rama):

git checkout master 

continuación, restablezca al cabezal remoto^(que va a eliminar todos los cambios locales), forzar limpieza y extracción:

git reset HEAD^ --hard && git clean -df && git pull