¿Cómo cancelar 'git add' antes de cometer?

Por error, agregué archivos a git con el comando:

 git add myfile.txt 

No he ejecutado git commit todavía. ¿Hay alguna forma de cancelar esto para que estos archivos no se incluyan en la confirmación?


Por el momento hay 48 respuestas (algunas eliminadas). No agregue una nueva si no tiene información nueva.

7856
08 дек. fijado por paxos1977 08 dic. 2008-12-08 00:57 '08 a las 0:57 2008-12-08 00:57
@ 34 respuestas
  • 1
  • 2

Puede cancelar git add antes de comprometerse con

 git reset <file> 

que lo eliminará del índice actual (la lista de "a punto de comprometerse") sin cambiar nada más.

Puedes usar

 git reset 

sin ningún nombre de archivo para deshabilitar todos los cambios. Esto puede ser útil cuando se enumeran demasiados archivos uno por uno dentro de un tiempo razonable.

En versiones anteriores de Git, los comandos anteriores son equivalentes a git reset HEAD <file> y git reset HEAD respectivamente, y no tendrán éxito si HEAD no está definido (porque no ha confirmado ningún compromiso en su repositorio) o ambiguo (porque creó una rama con nombre HEAD , que es una estupidez que no debes hacer). Esto se cambió en Git 1.8.2 , aunque en las versiones modernas de Git puedes usar los comandos anteriores antes de crear tu primer confirmación:

"git reset" (sin parámetros ni parámetros) utilizado para usted no tiene ningún compromiso en su historial, pero ahora le da un índice vacío (para que coincida con un compromiso no existente, ni siquiera está incluido).

8850
08 дек. respuesta se da genehack 08 dic. 2008-12-08 01:30 '08 a la 1:30 2008-12-08 01:30

Tu quieres

 git rm --cached <added_file_to_undo> 

Justificación:

Cuando era nuevo en esto, primero intenté

 git reset . 

(para cancelar todas mis cargas iniciales), solo para recibir este (no muy) útil mensaje:

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

Resulta que esto se debe a que el enlace HEAD (¿rama?) Existe solo después de la primera confirmación. Es decir, se encontrará con el mismo problema de novato que yo si su flujo de trabajo, como el mío, se verá así:

  1. Ir a mi nuevo directorio de proyectos para probar Git, el nuevo entusiasmo
  2. git init
  3. git add.
  4. git status

    ... un montón de pergaminos ...

    > Maldición, no quería agregar todo esto.

  5. google "cancelar git añadir"

    => encontrar desbordamiento de pila - ooh

  6. git reset.

    => fatal: no se pudo resolver 'HEAD' como un enlace válido.

Además, resulta que un mensaje de error está registrado en la lista de distribución.

Y que la decisión correcta fue justo allí en la salida de estado de Git (que, sí, llamé "basura")

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

Y la solución realmente es usar git rm --cached FILE .

Tenga en cuenta las advertencias en otros lugares aquí: git rm elimina su copia de trabajo local del archivo, pero no si utiliza --cached . Aquí está el resultado de git help rm :

--cached Use esta opción para eliminar y eliminar rutas del índice solamente. Los archivos de escritorio, modificados o no, permanecerán.

Estoy empezando a usar

 git rm --cached . 

borra todo y vuelve a empezar. No funcionó, porque, aunque se add. Es recursivo, resulta que rm necesita -r para la recursión. Suspiro

 git rm -r --cached . 

Ok, ahora estoy de vuelta a donde empecé. La próxima vez voy a usar -n para la ejecución -n y ver qué se agregará:

 git add -n . 

Archivé todo en un lugar seguro antes de confiar en git help rm para decir que --cached no destruye nada (y si lo escribí mal).

2013
25 марта '09 в 19:20 2009-03-25 19:20 la respuesta la da Rhubarb el 25 de marzo de 2009 a las 19:20 2009-03-25 19:20

Si escribe:

 git status 

git le dirá lo que está ocurriendo, etc., incluidas las instrucciones sobre cómo desconectarse:

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

Me parece que Git hace un buen trabajo y me empuja a hacer lo correcto en estas situaciones.

Nota Las versiones recientes de git (1.8.4.x) han cambiado este mensaje:

 (use "git rm --cached <file>..." to unstage) 
498
08 дек. La respuesta está dada por Paul Beckingham 08 dic. 2008-12-08 02:22 '08 a las 2:22 am 2008-12-08 02:22

Para aclarar: git add mueve los cambios desde el directorio de trabajo actual a un área intermedia (índice).

Este proceso se llama intermedio. Por lo tanto, el comando más natural para cambiar cambios (archivos modificados) es obvio:

 git stage 

git add es solo un alias para git stage

Es una pena que no haya git unstage y git unadd . La pregunta correspondiente es más difícil de adivinar o recordar, pero es bastante obvia:

 git reset HEAD -- 

Podemos crear fácilmente un alias para esto:

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

Y por último, tenemos nuevos equipos:

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

Personalmente, uso pseudónimos incluso más cortos:

 git a #for staging git u #for unstaging 
232
10 сент. La respuesta toma 10 de septiembre. 2010-09-10 23:28 '10 a las 23:28 2010-09-10 23:28

Además de la respuesta aceptada, si su archivo agregado por error fue enorme, probablemente notará que incluso después de eliminarlo del índice usando " git reset " todavía tiene lugar en el directorio .git . No debe preocuparse por eso, el archivo todavía está en el repositorio, pero solo como un "objeto libre", no se copiará a otros repositorios (a través de un clon, push), y el espacio se liberará eventualmente, aunque quizás no muy pronto . Si estás preocupado, puedes correr:

 git gc --prune=now 

Actualización (en lo sucesivo, intentaré eliminar algunas confusiones que puedan surgir de las respuestas con el mayor número de votos):

Entonces, ¿cuál es la cancelación real de git add ?

git reset HEAD <file> ?

o

git rm --cached <file> ?

Hablando estrictamente, y si no me equivoco: no .

git add no se puede deshacer , de forma segura, en general.

Primero recordemos lo que git add <file> realmente hace:

  1. Si no se realizó el seguimiento de <file> , git add agrega al caché con su contenido actual.

  2. Si <file> ya <file> rastreado , git add guarda el contenido actual (instantánea, versión) en el caché. En GIT, esta acción aún se llama agregar (y no solo actualizar), porque dos versiones diferentes (instantáneas) de un archivo se tratan como dos elementos diferentes: por lo tanto, agregamos un nuevo elemento a la memoria caché, para que se realice más adelante.

A la luz de esto, la pregunta es algo ambigua:

Añadí archivos erróneamente usando el comando ...

El script OP parece ser el primero (archivo sin seguimiento), queremos "deshacer" para eliminar el archivo (y no solo el contenido actual) de los elementos monitoreados. Si es así, puede ejecutar git rm --cached <file> .

Y también podemos ejecutar git reset HEAD <file> . En general, esto es preferible porque funciona en ambos escenarios: también cancela acciones cuando agregamos por error una versión de un elemento ya rastreado.

Pero hay dos advertencias.

Primero: hay (como se indica en la respuesta) solo un script en el que git reset HEAD no funciona, pero git rm --cached funciona: un nuevo repositorio (sin confirmaciones). Pero, de hecho, esto es prácticamente irrelevante.

En segundo lugar, tenga en cuenta que git reset HEAD no puede restaurar mágicamente los contenidos de archivos previamente almacenados en caché, simplemente lo vuelve a sincronizar con HEAD. Si nuestro git add incorrecto git add sobrescrito la versión anterior no confirmada, no podremos recuperarla. Por lo tanto, estrictamente hablando, no podemos cancelar [*].

Ejemplo:

 $ git init $ echo "version 1" > file.txt $ git add file.txt # first add of file.txt $ git commit -m 'first commit' $ echo "version 2" > file.txt $ git add file.txt # stage (don't commit) "version 2" of file.txt $ git diff --cached file.txt -version 1 +version 2 $ echo "version 3" > file.txt $ git diff file.txt -version 2 +version 3 $ git add file.txt # oops we didn't mean this $ git reset HEAD file.txt # undo ? $ git diff --cached file.txt # no dif, of course. stage == HEAD $ git diff file.txt # we have lost irrevocably "version 2" -version 1 +version 3 

Por supuesto, esto no es muy importante si simplemente seguimos el habitual flujo de trabajo lento de ejecución de 'git add' solo para agregar nuevos archivos (caso 1), y actualizamos el nuevo contenido con el comando commit, git commit -a .


* (Edición: Lo anterior es casi correcto, pero todavía puede haber varias formas de recuperación de los cambios que se entregaron, pero no se arreglaron y luego se sobrescribieron, consulte los comentarios de Johannes Matokich y iolsmit)

153
18 мая '11 в 21:05 2011-05-18 21:05 La respuesta es dada por leonbloy el 18 de mayo de 2011 a las 21:05 2011-05-18 21:05
 git rm --cached . -r 

"anulará" todo lo que agregaste del directorio actual de forma recursiva

89
10 дек. respuesta dada por braitsch 10 dec. 2009-12-10 00:19 '09 a las 0:19 2009-12-10 00:19

Correr

 git gui 

y elimine todos los archivos manualmente o seleccionándolos todos y presionando el botón de confirmación con confirmar.

83
12 окт. Respuesta dada por Khaja Minhajuddin el 12 de octubre. 2011-10-12 04:12 '11 a las 4:12 del 2011-10-12 04:12

Git tiene comandos para cada acción imaginable, pero necesita un amplio conocimiento para hacer las cosas bien, y por eso es contraintuitivo en el mejor de los casos ...

¿Qué hiciste antes?

  • Se modificó el archivo y se usa git add . o git add <file> .

Que quieres

  • Elimine el archivo del índice, pero guárdelo en las versiones y déjelo con los cambios no fijados en la copia de trabajo:

     git reset head <file> 
  • Restablezca el archivo con el último estado de HEAD, descartando los cambios y eliminándolos del índice:

29 марта '13 в 14:14 2013-03-29 14:14 la respuesta se da sjas 29 de marzo '13 a las 14:14 2013-03-29 14:14

Para cancelar un archivo que ya se ha agregado es bastante simple, usando git , para restablecer myfile.txt que ya se ha agregado, use:

 git reset HEAD myfile.txt 

Explique

Después de poner archivos innecesarios para cancelar, puede git reset , Head es git reset su archivo en la red local, y el último parámetro es el nombre de su archivo.

Creo los pasos que se muestran en la figura a continuación, con más detalle para usted, incluidos todos los pasos que pueden ocurrir en los siguientes casos:

2019

28 июня '17 в 13:43 2017-06-28 13:43 Alireza da la respuesta el 28 de junio de 17 a las 1:43 p. M. 2017-06-28 13:43

La pregunta es claramente no formulada. La razón es que git add tiene dos significados:

  • agregue un nuevo archivo al área de preparación, luego cancele con git rm --cached file .
  • Agregando un archivo que ha sido modificado a un área de preparación, luego cancele con git reset HEAD file .

En caso de duda, utilizar.

 git reset HEAD file 

Porque en ambos casos se espera lo esperado.

Advertencia: si git rm --cached file en el archivo se modifica (el archivo que existía anteriormente en el repositorio), entonces el archivo se eliminará en git commit ! Seguirá existiendo en su sistema de archivos, pero si alguien más extrae su confirmación, el archivo se eliminará de su árbol de trabajo.

git status te dice si el archivo fue nuevo o cambiado :

 On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: my_new_file.txt modified: my_modified_file.txt 
69
16 янв. La respuesta fue dada por Michael_Scharf el 16 de enero. 2014-01-16 22:54 '14 a las 10:54 pm 2014-01-16 22:54

Si está utilizando su confirmación original y no puede usar git reset, simplemente declare "Git quiebra", elimine la carpeta .git y comience por ella.

58
19 нояб. Respuesta dada por Paul Betts el 19 de noviembre. 2009-11-19 19:39 '09 a las 19:39 2009-11-19 19:39

Como con muchas otras respuestas, puedes usar git reset

PERO

Encontré este maravilloso mensaje que en realidad agrega un comando git unadd (bueno, alias) para git unadd : vea git unadd para más detalles o ...

Solo

 git config --global alias.unadd "reset HEAD" 

Ahora tu puedes

 git unadd foo.txt bar.txt 
54
01 окт. la respuesta es dada por electblake 01 oct. 2010-10-01 17:54 '10 a las 17:54 2010-10-01 17:54

git remove o git rm se pueden usar para esto con el indicador --cached . Prueba

 git help rm 
45
08 дек. la respuesta es dada por gnud 08 dec. 2008-12-08 01:00 '08 a la 1:00 2008-12-08 01:00

Utilice git add -i para eliminar los archivos recién agregados de su próxima confirmación. Ejemplo:

Agregando un archivo que no necesita:

 $ git add foo $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: foo # # Untracked files: # (use "git add <file>..." to include in what will be committed) # [...]# 

Habilite la adición interactiva para cancelar su adición (los comandos ingresados ​​en git aquí: "r" (retorno), "1" (la primera entrada en la lista regresará), "regresar" para salir del modo de retorno y "q" (salir):

 $ git add -i staged unstaged path 1: +1/-0 nothing foo *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> r staged unstaged path 1: +1/-0 nothing [f]oo Revert>> 1 staged unstaged path * 1: +1/-0 nothing [f]oo Revert>> note: foo is untracked now. reverted one path *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> q Bye. $ 

Que es esto Aquí está su prueba de que "foo" regresa a la lista sin dejar rastro:

 $ git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # [...] # foo nothing added to commit but untracked files present (use "git add" to track) $ 
41
18 апр. Respuesta dada por Alex North-Keys el 18 de abril. 2012-04-18 15:53 '12 a las 3:53 pm 2012-04-18 15:53

Aquí puede evitar este problema desagradable al lanzar un nuevo proyecto:

  • Crea un directorio base para tu nuevo proyecto.
  • Ejecutar git init .
  • Ahora crea un archivo .gitignore (incluso si está vacío).
  • Arregla el archivo .gitignore.

Git hace que sea muy difícil hacer un git reset Git si no tienes confirmaciones. Si creas una pequeña confirmación inicial solo por el bien de ella, entonces puedes git add -A y git reset tantas veces como quieras para que todo sea correcto.

Otra ventaja de este método es que si encuentra problemas de finalización de línea más adelante y necesita actualizar todos sus archivos, es fácil:

  • Tenga en cuenta que la solución inicial. Esto borrará todos tus archivos.
  • A continuación, compruebe su último compromiso de nuevo. Esto restaurará copias nuevas de sus archivos utilizando la configuración de final de línea actual.
36
25 сент. la respuesta es dada por Ryan Lundy 25 sep. 2011-09-25 02:34 '11 a las 2:34 del 2011-09-25 02:34

Tal vez Git haya evolucionado desde que publicaste tu pregunta.

 $> git --version git version 1.6.2.1 

Ahora puedes probar:

 git reset HEAD . 

Esto debe ser lo que buscas.

32
19 нояб. La respuesta es dada por Kokotte23 el 19 de noviembre. 2009-11-19 19:38 '09 a las 19:38 2009-11-19 19:38

Tenga en cuenta que si no especificó una revisión, debe incluir un separador. Un ejemplo de mi consola:

 git reset <path_to_file> fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree. Use '--' to separate paths from revisions git reset -- <path_to_file> Unstaged changes after reset: M <path_to_file> 

(git version 1.7.5.4)

32
23 янв. La respuesta se da powlo 23 jan. 2012-01-23 19:57 '12 a las 19:57 2012-01-23 19:57

Para eliminar archivos nuevos del área de preparación (y solo en el caso de un archivo nuevo), como se sugirió anteriormente:

 git rm --cached FILE 

Use rm --cached solo para agregar nuevos archivos accidentalmente.

29
22 июня '09 в 14:58 2009-06-22 14:58 La respuesta se le da a Ran el 22 de junio de 2009 a las 14:58 2009-06-22 14:58

Al restablecer cada archivo en una carpeta específica (y sus subcarpetas) puede usar el siguiente comando:

 git reset * 
23
26 июля '12 в 10:50 2012-07-26 10:50 la respuesta se da Zorayr 26 de julio de 2012 a las 10:50 2012-07-26 10:50

use el comando * para procesar varios archivos a la vez

 git reset HEAD *.prj git reset HEAD *.bmp git reset HEAD *gdb* 

y así sucesivamente

23
28 авг. boulder_ruby es respuesta 28 ago. 2013-08-28 00:15 '13 a las 0:15 2013-08-28 00:15

Simplemente escriba git reset , volverá, y parece que nunca ingresó a git add . Desde el último compromiso. Asegúrate de hacer esto antes.

21
19 мая '10 в 6:49 2010-05-19 06:49 La respuesta es dada por Donovan el 19 de mayo de 2010 a las 6:49 2010-05-19 06:49

Supongamos que creo un nuevo archivo newFile.txt .

2019

04 окт. La respuesta está dada por Vidura Mudalige 04 oct. 2016-10-04 14:02 '16 a las 2:02 pm 2016-10-04 14:02

Para un archivo específico:

  • git reset my_file.txt
  • git checkout my_file.txt

Para todos los archivos agregados:

  • reinicio de git
  • Git checkout.

Nota: la verificación cambia el código en los archivos y pasa al último estado actualizado (confirmado). restablecer no cambia los códigos; Él sólo deja caer el titular.

15
28 окт. La respuesta la da Hasib Kamal el 28 de octubre. 2017-10-28 09:03 '17 a las 9:03 2017-10-28 09:03

Este comando cambia tus cambios:

 git reset HEAD filename.txt 

También puedes usar

 git add -p 

para añadir partes de archivos.

12
31 янв. La respuesta se da wallerjake el 31 de enero. 2013-01-31 18:43 '13 a las 18:43 2013-01-31 18:43

Me sorprende que nadie mencione el modo interactivo:

 git add -i 

Seleccione la opción 3 para agregar archivos. En mi caso, a menudo quiero agregar varios archivos; en línea, puede usar estos números para agregar archivos. Solo lleva 4: 1,2,3,5.

Para seleccionar una secuencia, simplemente ingrese 1-5 para tomar todo del 1 al 5.

Git archivos intermedios

12
22 окт. Responder a Jonathan el 22 de octubre. 2015-10-22 16:03 '15 a las 16:03 2015-10-22 16:03

Para cancelar git add use

git reset filename

12
02 окт. respuesta dada por Anirudh Sood 02 oct. 2016-10-02 18:54 '16 a las 18:54 2016-10-02 18:54

git add myfile.txt # esto agregará su archivo a la lista de confirmación

A diferencia de este comando,

 git reset HEAD myfile.txt # this will undo it. 

Así, estarás en el estado anterior. El especificado estará nuevamente en la lista sin una traza (estado anterior).

Él restablecerá la cabeza con el archivo especificado. así que si tu cabeza no tiene esto, simplemente se restablece

8
27 июня '17 в 16:58 2017-06-27 16:58 Mohideen ibn Mohammed respondió el 27 de junio de 2017 a las 16:58 2017-06-27 16:58
 git reset filename.txt 

Elimina el archivo llamado filename.txt del índice actual, el área "a punto de comprometerse", sin cambiar nada.

8
11 июля '16 в 21:40 2016-07-11 21:40 La respuesta es dada por Rahul Sinha el 11 de julio de 2016 a las 21:40 2016-07-11 21:40

En SourceTree, puedes hacerlo fácilmente a través de gui. Puede verificar qué comando usa sourcetree para deshabilitar el archivo.

Creé un nuevo archivo y lo agregué a git. Luego lo apagué usando guit SourceTree. Este es el resultado:

Archivos sin etapas [12/08/15 10:43]
git -c diff. prefijo de mnemonic = falso -c núcleo. quotepath = false -c credenciales. helper = sourcetree reset -q - ruta /to / archivo / nombre de archivo.java

SourceTree usa reset para deshabilitar nuevos archivos.

7
08 дек. la respuesta es dada por miva2 08 dec. 2015-12-08 12:58 '15 a las 12:58 2015-12-08 12:58
 git reset filename.txt 

Elimina el archivo llamado filename.txt del índice actual, el área "a punto de comprometerse", sin cambiar nada.

6
26 окт. Respuesta dada por Joseph Mathew el 26 de octubre. 2017-10-26 21:15 '17 a las 21:15 2017-10-26 21:15
  • 1
  • 2

Otras preguntas sobre labels o Ask a Question