2011-01-31 30 views
427

Mi problema es que he cambiado un archivo por ejemplo: README, añade una nueva línea 'esto para mi línea de prueba' y se guarda el archivo, a continuación, emití los siguientes comandosCómo cancelar un local de Git cometer

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 presioné el código a github, ahora quiero cancelar este compromiso.

Para ello he utilizado

git reset --hard HEAD~1 

Pero perdieron la línea que acaba de agregar 'esto para mi línea de prueba' desde el archivo README. Esto no debería suceder. Necesito que el contenido esté allí. ¿Hay alguna manera de retener el contenido y cancelar mi confirmación local?

+1

Parece que definitivamente no estás pidiendo 'git revert', que crea una nueva confirmación con la diferencia inversa de la confirmación revertida. Restablecer 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: Puede valer la pena mencionar que 'git-commit' puede cancelarse si deja el mensaje en blanco, por lo que si aún no ha terminado, la confirmación podría ser útil. – GKFX

Respuesta

817

Sólo tiene que utilizar git reset sin la bandera --hard:

git reset HEAD~1 

PS: En los sistemas basados ​​en UNIX, puede utilizar HEAD^ que 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?.

+0

Gracias amigo ... :) –

+8

Por cierto, esto se llama '--mixed' [en el manual] (http://www.kernel.org/pub/software/scm/git/docs/git-reset. html # _description). –

+5

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

95

Uso --soft en lugar de --hard bandera:

git reset --soft HEAD^ 
+11

, ¿puedes explicar la diferencia entre el 2 banderas? –

+1

Si abre Package Manager Console y ejecuta este "git reset --soft HEAD ^", hace lo que quiere (y lo que necesitaba). –

+22

@JohnGiotta - 'git reset --soft HEAD ^' eliminará la última confirmación local (sin aplicar) pero ** mantendrá los cambios ** lo ha hecho – fider

15

Si estás en el medio de una confirmación (es decir, en su editor ya), puede cancelarla mediante la supresión de todas las líneas por encima de la primera #. Eso abortará el compromiso.

modo que puede eliminar todas las líneas de modo que el mensaje de entrega está vacía, a continuación, guarde el archivo:

It should look like this.

A continuación, aparece un mensaje que dice Aborting commit due to empty commit message..

+3

¡Esto es * exactamente * lo que estaba buscando! Esta respuesta necesita más votos positivos :) – jdunk