Eliminar un git commit que no ha sido empujado

724

Hice un git commitpero aún no lo he empujado al repositorio. Entonces, cuando lo hago git status, obtengo '# Su rama está por delante de' maestro 'por 1 commit.

Entonces, si quiero revertir mi confirmación principal, ¿puedo hacer lo siguiente?

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

dado que cuando lo hago git logme sale:

commit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Fecha: martes 29 de septiembre 11:21:41 2009 -0700


commit db0c078d5286b837532ff5e276dcf91885df2296
Fecha: martes 22 de septiembre 10:31:37 2009 -0700
hap497
fuente
99
Esta pregunta parece ser un duplicado de otra de sus propias preguntas: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell
1
Posible duplicado de los commits
Leonardo Alves Machado
1
Posible duplicado de ¿Cómo deshacer los últimos commits en Git?
Jan Zerebecki
3
PELIGRO: reset --hardpuede provocar la pérdida de trabajo, porque al hacerlo, git sobrescribe sus archivos locales (su nuevo trabajo) con los de la web (me pasó a mí). Las preguntas y respuestas sobre git deberían indicar explícitamente qué están haciendo sus comandos y cuáles son los riesgos para los lectores.
OrangeSherbet

Respuestas:

673

En realidad, cuando se utiliza git reset, se debe hacer referencia a la confirmación de que se está reposicionando a ; entonces querrías el db0c078commit, probablemente.

Una versión más fácil sería git reset --hard HEAD^restablecer el commit anterior antes del encabezado actual; de esa manera no tiene que estar copiando los ID de confirmación.

Tenga cuidado cuando haga alguno git reset --hard, ya que puede perder cualquier cambio no confirmado que tenga. Es posible que desee verificar git statuspara asegurarse de que su copia de trabajo esté limpia, o que desee eliminar cualquier cambio que haya allí.

Además, en lugar de HEAD, puede usarlo origin/mastercomo referencia, como lo sugiere @bdonlan en los comentarios:git reset --hard origin/master

Brian Campbell
fuente
374
O git reset --hard origin/master, para restablecerlo a cualquier origen.
bdonlan
1
Otro puntero útil al que puede restablecer es ORIG_HEAD o su generalización utilizando reflog HEAD @ {1} (la última posición de HEAD).
Jakub Narębski
12
Lector, antes git resettu código. Hazte un favor a resetreset --softreset --hardgit add
ti
3
Tenga en cuenta que esto eliminará lo que haya en la confirmación que desea eliminar (por git statuslo tanto, a no mostrará cambios y la confirmación se eliminará / se perderán los cambios).
Bjørn Børresen
12
NOTA: Tenga cuidado al usarlo, git reset --hard HEAD^ya que perderá los cambios en los archivos comprometidos (sus cambios se eliminarán). Hay dos ramas para esta pregunta: para revertir una confirmación pero aún tener cambios en el disco, hágalogit reset --soft HEAD~1
papigee
625

SI NO ha empujado sus cambios a control remoto

git reset HEAD~1

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

OTROS has empujado tus cambios a control remoto

git revert HEAD

Este comando revertirá / eliminará el último commit / change y luego puede presionar

Jeril Kuruvila
fuente
34
Esto responde a "Eliminar el último git commit que no ha sido empujado" (respuesta más cercana en mi humilde opinión)
Pierre de LESPINAY
25
Además, mantiene los cambios locales realizados en la última confirmación, mientras que git reset --hard no lo hace
Stanimir Stoyanov
1
para mí, deshacerá el último envío empujado y el envío no apresurado
CodyChan
git revert HEAD para mí acaba de eliminar todos los archivos que tenía listos para enviar. ¡Ten cuidado!
Jason Bruce
159
git reset --hard origin/master

para restablecerlo a cualquiera que sea el origen.

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

Shadoweb
fuente
44
Esta pregunta se hizo hace casi 5 años, y esto ya está en uno de los comentarios.
Anubian Noob
1
¿Qué sucede si la rama local actual difiere de la masterque debo usar origin/mybranch?
Pavel Vlasov
99
Normalmente no leo los comentarios cuando tengo prisa por una respuesta ... Gracias por responder (una simple que funciona)
Leonardo Alves Machado
Advertencia: tenga en cuenta que esto eliminará todos los cambios existentes en el código, aparte de los git reset HEAD~que solo retrasan la confirmación en el código
Mayer Spitzer
70

Hay dos ramas para esta pregunta (deshacer una confirmación no significa que quiera perder todos mis cambios locales):

1. Para revertir los últimos cambios de confirmación y descarte en el archivo confirmado, haga lo siguiente:

git reset --hard HEAD~1

2. Para revertir la última confirmación pero conservar los cambios locales (en el disco), haga lo siguiente:

git reset --soft HEAD~1

Este (el comando posterior) lo llevará al estado en el que hubiera estado si lo hubiera hecho git add.

Si desea quitar la etapa de los archivos después de eso, haga

git reset

Ahora puede hacer más cambios antes de agregar y luego volver a comprometerse.

papigee
fuente
47

Simplemente escriba en la consola:

$ git reset HEAD~

Este comando descarta todas las confirmaciones locales antes del HEAD remoto

marcdahan
fuente
77
¿Puedes explicar qué agrega tu respuesta sobre las respuestas existentes?
nvoigt
Esto borra el compromiso actual antes de presionar, sin revertir los cambios que ha realizado localmente, como las otras respuestas, lo que podría ser un momento grave de retirada del cabello
Grant
43

Creo que uno de esos se ajustará a tus necesidades.

1 - Deshacer confirmar y mantener todos los archivos organizados: git reset --soft HEAD~;

2 - Deshacer el compromiso y desestadificar todos los archivos git reset HEAD~;

3 - Deshacer la confirmación y eliminar completamente todos los cambios: git reset --hard HEAD~;

aquí es donde encontré la respuesta

M. Massula
fuente
Esta respuesta tiene que ser aceptada: D
Aaron John Sabu
30

Elimine la última confirmación antes de presionar

git reset --soft HEAD~1

1significa la última confirmación, si desea eliminar dos últimos usos 2, y así sucesivamente *

Karina Haddad
fuente
3
Hola Karina, la mención de --softes una gran adición a las posibles respuestas, pero ¿podrías mencionar también por qué? Explicar su solución siempre es útil. También trate de seguir con el inglés. Gracias
Vlastimil Ovčáčík
1
--soft- asegura que no pierdas los cambios en el archivo cuya confirmación estás tratando de deshacer
papigee
19

He experimentado la misma situación que hice a continuación, ya que esto es mucho más fácil. Al pasar commit-Id, puede llegar al compromiso particular al que desea ir:

git reset --hard {commit-id}

Como desea eliminar su última confirmación, debe pasar el lugar commit-Iddonde necesita mover el puntero:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296
Kamlesh Patidar
fuente
Solo una advertencia para los novatos como yo: haga una copia de seguridad de los archivos donde desee MANTENER los cambios, ya que se revertirán a la versión anterior. Mi escenario fue que accidentalmente puse un volcado de la base de datos en mi directorio de repositorios y luego los comprometí; obviamente no quería confirmar esos archivos en el repositorio, pero sí 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 restablecimiento de git.
user1063287
10

Esto es lo que hago:

Primero revise su sucursal (para mi mastersucursal):

git checkout master

Luego reinicie a HEAD remoto ^ ( eliminará todos los cambios locales ), fuerce la limpieza y tire:

git reset HEAD^ --hard && git clean -df && git pull
Adnan
fuente
1
Es una opción muy nuclear. Sugeriría restablecimiento parcial a confirmación limitada.
c0der512
3

Una forma sería eliminar la sucursal local y retirar esa sucursal del servidor si su sucursal local está por delante de la remota por múltiples confirmaciones y necesita deshacerlas todas.

saga123
fuente
respuesta brillante: permite hacer clic fácilmente en sourcetree :)
Kamil Kiełczewski
1

Simplemente tuve el mismo problema y terminé haciendo:

git rebase -i HEAD~N

(N es el número de confirmaciones que le mostrará git)

Eso solicita su editor de texto y luego puede eliminar la confirmación que desea eliminando la línea asociada a él.

MrCas
fuente