8821 votos

Deshacer 'git add' antes de cometer

Cometí un error y agregé archivos que no quería usando el comando

git add file

Aún no he ejecutado git commit. Hay una manera de deshacer o eliminar estos archivos del commit?

10167voto

genehack Puntos 26851

Usted también puede

git reset 

que lo quitará del actual índice ("about to be committed") sin cambiar nada más. Tenga en cuenta que git reset es el atajo para git reset HEAD .

Usted puede utilizar git reset sin ningún nombre de archivo para deshacer todos los cambios. Esto puede ser útil cuando hay muchos archivos para añadirlos uno a uno.

2133voto

Rhubarb Puntos 16453

Se desea:

git rm --cached <added_file_to_undo>

Razonamiento:

Cuando yo era nuevo esto, probé por primera vez

git reset .

(a deshacer de toda mi inicial añadir), sólo para conseguir este (no tan) útil mensaje:

fatal: Failed to resolve 'HEAD' as a valid ref.

Resulta que esto es debido a que la HEAD ref (rama?) no existe hasta después de la primera confirmación. Es decir, que se ejecutan en el mismo principiante del problema como a mí, si el flujo de trabajo, como la mía, era algo como:

  1. cd para mi gran proyecto nuevo directorio para probar Git, el nuevo calor
  2. git init
  3. git add .
  4. git status

    ... un montón de mierda se desplaza por ...

    => Maldita sea, yo no quiero añadir todo eso.

  5. google "deshacer el comando git add"

    => buscar Stack Overflow - yay

  6. git reset .

    => fatal: no se pudo resolver " HEAD " como una válida ref.

Además, resulta que hay un error se registra en contra de la unhelpfulness de este en la lista de correo.

Y que la solución correcta fue allí mismo, en el primer momento la salida de estado (que, sí, he glosado como " crap)

...
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
...

Y la solución, de hecho es utilizar git rm --cached FILE.

Observe las advertencias de otros lugares aquí - git rm elimina la copia local del archivo, pero no se si utilizas --en caché. Aquí está el resultado de git help rm:

--en caché El uso de esta opción para unstage y quitar caminos que sólo a partir del índice. Trabajo de árbol de archivos, ya sea modificado o no, será a la izquierda.

Me proceder a la utilización de

git rm --cached .

para quitar todo y empezar de nuevo. No trabajo, porque mientras add . es recursivo, se convierte rm necesidades -r a recurse. Suspiro.

git rm -r --cached .

Bueno, ahora ya estoy de vuelta donde empecé. La próxima vez voy a usar -n hacer una marcha en seco y ver lo que se agregó:

git add -n .

He metido todo en un lugar seguro antes de confiar git help rm sobre el --cached no destruir nada (y lo que si he escrito mal).

529voto

Paul Beckingham Puntos 7460

Si tipo:

git status

git le dirá lo que se pone en escena, etc, incluyendo las instrucciones sobre cómo unstage:

use "git reset HEAD <file>..." to unstage

Me parece git hace un trabajo bastante bueno de instar a mí a hacer lo correcto en situaciones como esta.

Nota: las Recientes versiones git (1.8.4.x) han cambiado este mensaje:

(use "git rm --cached <file>..." to unstage)

243voto

takeshin Puntos 16579

Para aclarar: git add mueve cambios desde el directorio actual de trabajo al área de ensayo (índice).

Este proceso se denomina estadificación. Así que lo más natural comando a la etapa de los cambios (cambios en los archivos) es la más obvia:

git stage

git add es sólo una más fácil escribir alias git stage

Lástima que no hay git unstage ni git unadd comandos. La más relevante es la más difícil de imaginar o recordar, pero es bastante obvio:

git reset HEAD --

Fácilmente podemos crear un alias para esto:

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'

Y por último, tenemos nuevos comandos:

git add file1
git stage file2
git unadd file2
git unstage file1

Personalmente yo uso aún más corto alias:

git a #for staging
git u #for unstaging

92voto

braitsch Puntos 3353
git rm --cached . -r

"la onu-añadir" todo lo que haya añadido desde su actual directorio de forma recursiva

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X