Cómo cancelar una confirmación local de git


745

Mi problema es que he cambiado un archivo, por ejemplo: README, agregué una nueva línea ' esto para mi línea de prueba ' y guardé el archivo, luego emití los siguientes comandos

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

No envié el código a github, ahora quiero cancelar este commit.

Para esto usé

   git reset --hard HEAD~1

Pero perdí la línea recién agregada ' esto para mi línea de prueba ' del archivo README. Esto no debería suceder. Necesito el contenido para estar allí. ¿Hay alguna manera de retener el contenido y cancelar mi confirmación local?


3
Parece que definitivamente no está pidiendo git revert, lo que crea una nueva confirmación con la diferencia inversa de la confirmación revertida. El reinicio simplemente apunta su rama actual a una confirmación diferente, en este caso, la anterior a la confirmación que desea "olvidar".
Cascabel

1
NB: Vale la pena mencionar que git-commitpuede abortar si deja el mensaje en blanco, por lo que si realmente no ha terminado la confirmación, podría ser útil.
GKFX

Respuestas:


1424

Solo use git resetsin la --hardbandera:

git reset HEAD~1

PD: en los sistemas basados ​​en Unix puedes usar el HEAD^cual es igual a HEAD~1. En Windows HEAD^no funcionará porque ^señala una continuación de línea. Entonces su símbolo del sistema simplemente le preguntará More?.


13
Por cierto, esto se llama --mixed en el manual .
Josh Lee el

10
Las versiones más nuevas de Git incluso permiten @^como abreviatura HEAD^.
Koraktor

No sé qué hizo esto, pero muchos archivos aparecen en mi lista de cambios, archivos que no toqué
FRR

@feresr Si realmente no tocó esos archivos en la última confirmación o en el árbol de trabajo, esto se debe a otras inconsistencias en su árbol de trabajo, por ejemplo, está en Windows y las terminaciones de los archivos no coinciden.
Koraktor

1
¿Es posible restablecer todos los commit por un lado?
Webwoman

185

Usar en --softlugar de --hardbandera:

git reset --soft HEAD^

18
¿Puedes explicar la diferencia entre las 2 banderas?
John Giotta

1
Si abre Package Manager Console y ejecuta este "git reset --soft HEAD ^", hace lo que desea (y lo que necesitaba).
David Cornelson

54
@JohnGiotta - git reset --soft HEAD^eliminará último local (unpushed) comprometerse pero mantener los cambios que has hecho
fider

@fider Salvador! No estoy seguro de si la respuesta aceptada aún funciona, pero esta debería ser la respuesta exacta que necesitaba el OP.
Babu

git reset --soft HEAD~en windows
Jack0fshad0ws

34

Si está en medio de una confirmación (es decir, en su editor ya), puede cancelarla eliminando todas las líneas sobre la primera #. Eso abortará el commit.

Por lo tanto, puede eliminar todas las líneas para que el mensaje de confirmación esté vacío, luego guarde el archivo:

Debe tener un aspecto como este.

Luego recibirá un mensaje que dice Aborting commit due to empty commit message..

EDITAR :

También puede eliminar todas las líneas y el resultado será exactamente el mismo.

Para eliminar todas las líneas en vim (si ese es su editor predeterminado), una vez que esté en el editor, escriba ggpara ir a la primera línea y luego dGelimine todas las líneas. Finalmente, escriba y salga del archivo wqy su confirmación se cancelará .


3
¡Esto es exactamente lo que estaba buscando! Esta respuesta necesita más votos a favor :)
jdunk

Para su información, esto también funciona si está tratando de abortar unarebase -i mybranchname
inostia

18

Lo primero que debe hacer es determinar si desea conservar los cambios locales antes de eliminar el mensaje de confirmación.

Use git logpara mostrar los mensajes de confirmación actuales, luego encuentre el commit_id antes de la confirmación que desea eliminar, no la confirmación que desea eliminar.

Si desea conservar los archivos modificados localmente y simplemente eliminar el mensaje de confirmación:

git reset --soft commit_id

Si desea eliminar todos los archivos modificados localmente y el mensaje de confirmación:

git reset --hard commit_id

Esa es la diferencia de blando y duro


1
Creo que es todo lo contrario.
Ruff9

9

Puede decirle a Git qué hacer con su índice (conjunto de archivos que se convertirá en el próximo commit) y el directorio de trabajo al realizar el restablecimiento de git utilizando uno de los parámetros:

--soft: Solo las confirmaciones se restablecerán, mientras que el índice y el directorio de trabajo no se alteran.

--mixed: Esto restablecerá el índice para que coincida con el HEAD, mientras que el directorio de trabajo no se tocará. Todos los cambios permanecerán en el directorio de trabajo y aparecerán como modificados.

--hard: Restablece todo (commits, index, directorio de trabajo) para que coincida con el HEAD.

En su caso, usaría git reset --softpara mantener sus cambios modificados en el índice y el directorio de trabajo. Asegúrese de revisar esto para obtener una explicación más detallada.


1

Utilice el siguiente comando:

$ git reset HEAD~1

Después de esto, también puede ver los archivos que se revierten, como la respuesta a continuación.

Unstaged changes after reset:
M   application/config/config.php
M   application/config/database.php
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.