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?

Amal Kumar S
fuente
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?.

Koraktor
fuente
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^
TpED
fuente
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á .

inostia
fuente
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

mistdon
fuente
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.

Nesha Zoric
fuente
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
Omkar
fuente