¿Cómo deshago 'git add' antes de confirmar?

8966

Agregué por error archivos a Git usando el comando:

git add myfile.txt

Aún no he corrido git commit. ¿Hay alguna manera de deshacer esto, por lo que estos archivos no se incluirán en la confirmación?

paxos1977
fuente
22
Comenzando con Git v1.8.4, todas las respuestas a continuación que usan HEADo headahora pueden usar @en su lugar HEAD. Vea esta respuesta (última sección) para saber por qué puede hacer eso.
3
Hice un pequeño resumen que muestra todas las formas de quitar el escenario de un archivo: stackoverflow.com/questions/6919121/…
Daniel Alder
55
¿Por qué no git checkout?
Erik Reppen
13
@ErikReppen git checkoutno elimina los cambios por etapas del índice de confirmación. Solo revierte los cambios no organizados en la última revisión comprometida, que por cierto tampoco es lo que quiero, quiero esos cambios, solo los quiero en una confirmación posterior.
paxos1977
44
Si usa Eclipse, es tan simple como desmarcar los archivos en el cuadro de diálogo de confirmación
Hamzahfrq

Respuestas:

10374

Puede deshacer git addantes de comprometerse con

git reset <file>

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

Puedes usar

git reset

sin ningún nombre de archivo para desestabilizar todos los cambios debidos. Esto puede ser útil cuando hay demasiados archivos para enumerar uno por uno en un período de tiempo razonable.

En versiones anteriores de Git, los comandos anteriores son equivalentes git reset HEAD <file>y git reset HEADrespectivamente, y fallarán si no HEADestá definido (porque aún no ha realizado ninguna confirmación en su repositorio) o ambiguo (porque creó una rama llamada HEAD, lo cual es una estupidez que no deberías hacer). Sin embargo, esto se cambió en Git 1.8.2 , por lo que en las versiones modernas de Git puede usar los comandos anteriores incluso antes de realizar su primera confirmación:

"git reset" (sin opciones ni parámetros) se usa para generar un error cuando no tiene ningún commit en su historial, pero ahora le da un índice vacío (para que coincida con el commit inexistente que ni siquiera tiene).

genehack
fuente
92
Por supuesto, esto no es un verdadero deshacer, porque si el error git addsobrescribió una versión previa no confirmada, no podemos recuperarla. Traté de aclarar esto en mi respuesta a continuación.
leonbloy
77
git reset HEAD *.ext¿Dónde extestán los archivos de la extensión dada que desea agregar? Para mí fue *.bmp&*.zip
boulder_ruby
18
@ Jonny, el índice (también conocido como área de ensayo) contiene todos los archivos, no solo los archivos modificados. "Comienza la vida" (cuando revisa un commit o clona un repositorio) como una copia de todos los archivos en el commit señalados por HEAD. Entonces, si elimina un archivo del índice ( git rm --cached), significa que se está preparando para realizar una confirmación que elimine ese archivo. git reset HEAD <filename>por otro lado, copiará el archivo de HEAD al índice, para que la próxima confirmación no muestre ningún cambio realizado en ese archivo.
Comodín
11
Acabo de descubrir que hay un git reset -pigual git add -p. ¡Esto es asombroso!
donquixote
10
En realidad, puede recuperar sobrescritos cambios realizados previamente pero no confirmados, pero no de una manera fácil de usar y no 100% segura (al menos ninguno que haya encontrado): goto .git / objects, busque archivos creados en el momento en git addque desea recuperar ( 61/3AF3...- > ID del objeto 613AF3...), entonces git cat-file -p <object-id>(podría valer la pena recuperar varias horas de trabajo pero también una lección para comprometerse más a menudo ...)
Peter Schneider
2151

Usted quiere:

git rm --cached <added_file_to_undo>

Razonamiento:

Cuando era nuevo en esto, lo intenté por primera vez

git reset .

(para deshacer toda mi adición inicial), solo para obtener este (no tan) mensaje útil:

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

Resulta que esto se debe a que la referencia HEAD (¿rama?) No existe hasta después de la primera confirmación. Es decir, te encontrarás con el mismo problema de principiante que yo si tu flujo de trabajo, como el mío, fuera algo así como:

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

    ... muchos rollos de basura por ...

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

  5. google "deshacer git add"

    => buscar desbordamiento de pila - yay

  6. git reset .

    => fatal: no se pudo resolver 'HEAD' como una referencia válida.

Resulta que hay un error registrado en contra de la inutilidad de esto en la lista de correo.

Y que la solución correcta estaba allí en la salida de estado de Git (que, sí, lo pasé por alto como 'basura')

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

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

Tenga en cuenta las advertencias en otro lugar aquí: git rmelimina su copia de trabajo local del archivo, pero no si usa --cached . Aquí está el resultado de git help rm:

--cached Use esta opción para quitar etapas y eliminar rutas solo del índice. Se dejarán los archivos del árbol de trabajo, ya sea modificado o no.

Procedo a usar

git rm --cached .

para eliminar todo y comenzar de nuevo. Sin embargo, no funcionó, porque si bien add .es recursivo, resulta que rmdebe -rrepetirse. Suspiro.

git rm -r --cached .

Bien, ahora estoy de vuelta a donde empecé. La próxima vez voy a usar -npara hacer una carrera en seco y ver qué se agregará:

git add -n .

Comprimí todo en un lugar seguro antes de confiar git help rmen que --cachedno destruiría nada (y qué pasa si lo escribí mal).

Ruibarbo
fuente
15
Ja Seguí este mismo proceso. Excepto que me di por vencido y dije rm -rf .git, git initporque no confiaba git rm --cacheden mantener mi copia de trabajo. Dice un poco sobre cómo git sigue siendo demasiado complejo en algunos lugares. git unstagedebería ser un comando estándar estándar, no me importa si puedo agregarlo como un alias.
Adrian Macneil
55
Para mí git dicegit reset HEAD <File>...
drahnr
16
git rm --cached <file> es en realidad la respuesta correcta, si es la importación inicial de <file> en el repositorio. Si está tratando de eliminar el cambio del archivo, git reset es la respuesta correcta. Las personas que dicen que esta respuesta es incorrecta están pensando en una pregunta diferente.
Barry Kelly
14
En realidad, esto funcionará, pero solo en la primera confirmación, donde el archivo no existía antes, o donde el git addcomando agregó nuevos archivos, pero no cambia los archivos existentes.
naught101
44
solo muestra cuán poco intuitivo y enrevesado es git. en lugar de tener comandos paralelos de "deshacer", debe averiguar cómo deshacerlos. Como tratar de liberar su pierna en arena rápida, y luego atascar su brazo, luego atascar su otro brazo ... cada comando debe hacerse a través de la GUI, con elementos de menús desplegables para las opciones ... Piense en toda la IU, Hemos tenido ganancias de productividad, pero tenemos este lío de una interfaz de línea de comando retro. No es que los programas git GUI hagan que esto sea más intuitivo.
ahnbizcad
532

Si escribe:

git status

Git le dirá lo que está organizado, etc., incluidas las instrucciones sobre cómo quitar el escenario:

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

Me parece que Git hace un buen trabajo al empujarme a hacer lo correcto en situaciones como esta.

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

(use "git rm --cached <file>..." to unstage)
Paul Beckingham
fuente
19
El mensaje será diferente dependiendo de si el addarchivo ed ya estaba siendo rastreado ( addsolo se guardó una nueva versión en el caché; aquí mostrará su mensaje). En otros lugares, si el archivo no se use "git rm --cached <file>..." to unstage
preparó
¡Excelente! El git reset HEAD <file>uno es el único que funcionará en caso de que desee eliminar la eliminación de un archivo
skerit
2
Mi versión 2.14.3 de git dice git reset HEADque desestabilice
SilverWolf - Restablece a Mónica el
246

Para aclarar: git addmueve los cambios del directorio de trabajo actual al área de preparación (índice).

Este proceso se llama puesta en escena . Entonces, el comando más natural para organizar los cambios (archivos modificados) es el obvio:

git stage

git add es solo un alias más fácil de escribir para git stage

Lástima que no hay git unstageni git unaddcomandos. El relevante es más difícil de adivinar o recordar, pero es bastante obvio:

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 finalmente, tenemos nuevos comandos:

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

Personalmente uso alias aún más cortos:

git a # For staging
git u # For unstaging
tomashin
fuente
3
"movimientos"? Esto indicaría que se ha ido del directorio de trabajo. Ese no es el caso.
Thomas Weller
44
¿Por qué es obvio?
Lenar Hoyt
En realidad, git stagees el alias de git add, que es el comando histórico, tanto en Git como en otros SCM. Se ha agregado en diciembre de 2008 con commit 11920d28da en el "repositorio de git de Git", si puedo decirlo.
Obsidiana
1
Esto puede no estar relacionado, pero he encontrado que validar el archivo incluso antes de agregarlo es una idea útil, algo así como check-command filename && git add filename, reemplacé git con una g más corta en mi máquina, y hasta ahora ha funcionado ok para mí: github.com/dataf3l/g , no sé si esto será útil para alguien, pero lo pondré aquí con la esperanza de que ahorre el tiempo de algunas personas.
Felipe Valdes
167

Además de la respuesta aceptada, si su archivo agregado por error era enorme, probablemente notará que, incluso después de eliminarlo del índice con ' git reset', todavía parece ocupar espacio en el.git directorio.

Esto no es nada de qué preocuparse; el archivo todavía está en el repositorio, pero solo como un "objeto suelto". No se copiará a otros repositorios (a través de clonar, empujar), y el espacio se recuperará eventualmente, aunque tal vez no muy pronto. Si está ansioso, puede correr:

git gc --prune=now

Actualizar (lo que sigue es mi intento de aclarar alguna confusión que pueda surgir de las respuestas más votadas):

Entonces, ¿cuál es el verdadero deshacer degit add ?

git reset HEAD <file> ?

o

git rm --cached <file>?

Estrictamente hablando, y si no me equivoco: ninguno .

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

Recordemos primero lo que git add <file>realmente hace:

  1. Si <file>se no rastreado previamente , git add lo agrega a la caché , con su contenido actual.

  2. Si <file>fue ya rastreado , git add guarda el contenido actual (instantánea, versión) a la caché. En Git, esta acción todavía se llama agregar , (no solo actualizarla ), porque dos versiones diferentes (instantáneas) de un archivo se consideran dos elementos diferentes: por lo tanto, de hecho, estamos agregando un nuevo elemento a la memoria caché, para ser eventualmente comprometido después.

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

Agregué por error archivos usando el comando ...

El escenario del OP parece ser el primero (archivo no rastreado), queremos que el "deshacer" elimine el archivo (no solo el contenido actual) de los elementos rastreados. Si este es el caso, entonces está bien ejecutar git rm --cached <file> .

Y también podríamos correr git reset HEAD <file>. En general, esto es preferible, porque funciona en ambos escenarios: también deshace cuando agregamos erróneamente una versión de un elemento ya rastreado.

Pero hay dos advertencias.

Primero: hay (como se señala en la respuesta) solo un escenario en el que git reset HEADno funciona, perogit rm --cached funciona: un nuevo repositorio (sin confirmaciones). Pero, realmente, este es un caso prácticamente irrelevante.

Segundo: tenga en cuenta que git reset HEAD no puede recuperar mágicamente el contenido del archivo previamente almacenado en caché, solo lo vuelve a sincronizar desde HEAD. Si nuestra equivocadagit add guía sobrescribió una versión previa no confirmada, no podemos recuperarla. Por eso, estrictamente hablando, no podemos deshacer [*].

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 irrevocably lost "version 2"
-version 1
+version 3

Por supuesto, esto no es muy crítico si solo seguimos el flujo de trabajo perezoso habitual de hacer 'git add' solo para agregar nuevos archivos (caso 1), y actualizamos nuevos contenidos a través del git commit -acomando commit .


* (Editar: lo anterior es prácticamente correcto, pero aún puede haber algunas formas un poco hackeadas / complicadas para recuperar los cambios que se organizaron, pero no se cometieron y luego se sobrescribieron; vea los comentarios de Johannes Matokic e iolsmit)

leonbloy
fuente
44
Estrictamente hablando, hay una manera de recuperar un archivo ya organizado que se reemplazó con git add. Como mencionas, git add crea un objeto git para ese archivo que se convertirá en un objeto suelto no solo al eliminar el archivo por completo sino también al sobrescribirlo con contenido nuevo. Pero no hay ningún comando para recuperarlo automáticamente. En cambio, el archivo debe identificarse y extraerse manualmente o con herramientas escritas solo para este caso (libgit2 lo permitirá). Pero esto solo se pagará si el archivo es muy importante y grande y no se puede reconstruir editando la versión anterior.
Johannes Matokic
2
Para corregirme: Una vez que se encuentre el archivo de objeto suelto (use metadatos como la fecha / hora de creación) git cat-filepodría usarse para recuperar su contenido.
Johannes Matokic
2
Otra forma de recuperar los cambios que se organizaron pero que no se confirmaron y luego se sobrescribieron, por ejemplo, con otra, git addes a través de git fsck --unreachableuna lista de todos los obj inalcanzables, que luego puede inspeccionar git show SHA-1_IDo git fsck --lost-found> Escribir objetos colgantes en .git/lost-found/commit/o .git/lost-found/other/, según el tipo. Ver tambiéngit fsck --help
iolsmit
110

Deshacer un archivo que ya se ha agregado es bastante fácil con Git. Para restablecer myfile.txt, que ya se han agregado, use:

git reset HEAD myfile.txt

Explicación:

Después de organizar los archivos no deseados, puede deshacerlos git reset.Heades la cabecera de su archivo en el local y el último parámetro es el nombre de su archivo.

He creado los pasos en la imagen a continuación con más detalles para usted, incluidos todos los pasos que pueden ocurrir en estos casos:

git reset HEAD file

Alireza
fuente
Imagen: "El comando agrega ...""El comando agrega ..." (tiempo presente simple, tercera persona )
Peter Mortensen
Imagen: quieroquiero (no hay necesidad de usar jerga aquí)
Peter Mortensen
92
git rm --cached . -r

"des-agregará" todo lo que haya agregado de su directorio actual de forma recursiva

Braitsch
fuente
3
No estaba buscando eliminar todo, solo UN archivo específico.
paxos1977
3
También es útil si no tiene confirmaciones anteriores. En ausencia de un compromiso previo, git reset HEAD <file>diríafatal: Failed to resolve 'HEAD' as a valid ref.
Priya Ranjan Singh
66
No, esto agrega una eliminación de todo en su directorio actual. Muy diferente a los cambios no estadísticos.
Mark Amery
88

correr

git gui

y elimine todos los archivos manualmente o seleccionándolos y haciendo clic en el botón Unstage from commit .

Khaja Minhajuddin
fuente
1
Sí, lo entiendo. Solo quería sugerir implícitamente que indiques eso en tu respuesta como "Puedes usar git-gui..." :)
Alexander Suraphel
1
Dice, "git-gui: comando no encontrado". No estoy seguro si esto funciona.
Parinda Rajapaksha
Wow, esto es mucho más simple que hacer líneas de comando que no entendiste. Esto definitivamente se recomienda para un principiante como yo. ¡Gracias por escribir esto!
Irfandy Jip
Gracias. No quería arriesgarme, así que tuve que usar GUI.
Sagar Khatri
83

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

Lo que hiciste antes:

  • Cambió un archivo y usó git add ., o git add <file>.

Lo que quieras:

  • Elimine el archivo del índice, pero manténgalo versionado y deje cambios sin confirmar en la copia de trabajo:

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

    # Think `svn revert <file>` IIRC.
    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    Esto es necesario ya git reset --hard HEADque no funcionará con archivos individuales.

  • Eliminar <file>del índice y el control de versiones, manteniendo el archivo sin versión con cambios en la copia de trabajo:

    git rm --cached <file>
    
  • Eliminar <file>de la copia de trabajo y versionar completamente:

    git rm <file>
    
sjas
fuente
1
No puedo entender la diferencia de 'git reset head <file>' y 'git rm --cached <file>. ¿Podrías explicarlo?
jeswang
66
Los archivos @jeswang son 'conocidos' por git (se están rastreando los cambios en ellos), o no están 'versionados'. reset headdeshace sus cambios actuales, pero git todavía está monitoreando el archivo. rm --cachedelimina el archivo del control de versiones, por lo que git ya no lo comprueba en busca de cambios (y también elimina los cambios actuales eventualmente indexados, indicados a git por el anterior add), pero el archivo modificado se guardará en su copia de trabajo, es decir, en su carpeta de archivos en el disco duro.
sjas
3
La diferencia es git reset HEAD <file>temporal: el comando se aplicará solo a la próxima confirmación, pero git rm --cached <file>se desestabilizará hasta que se agregue nuevamente git add <file>. Además, git rm --cached <file>significa que si empuja esa rama al control remoto, cualquiera que tire de la rama obtendrá el archivo REALMENTE eliminado de su carpeta.
DrewT
80

La pregunta no está claramente planteada. La razón es que git addtiene dos significados:

  1. agregar un nuevo archivo al área de preparación, luego deshacer con git rm --cached file.
  2. agregar un archivo modificado al área de preparación, luego deshacer con git reset HEAD file.

En caso de duda, use

git reset HEAD file

Porque hace lo esperado en ambos casos.

Advertencia: si lo hace git rm --cached fileen un archivo que fue modificado (un archivo que existía antes en el repositorio), ¡entonces el archivo se eliminará git commit! Todavía existirá en su sistema de archivos, pero si alguien más retira su confirmación, el archivo se eliminará de su árbol de trabajo.

git statusle dirá si el archivo era nuevo o modificado :

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
Michael_Scharf
fuente
77
+1. Un número extraordinario de respuestas y comentarios altamente votados en esta página son simplemente erróneos sobre el comportamiento de git rm --cached somefile. Espero que esta respuesta suba por la página a una posición destacada donde pueda proteger a los novatos de ser engañados por todas las afirmaciones falsas.
Mark Amery
Una de las mejores respuestas aquí, lamentablemente es bastante baja en la lista
Creos
64

Si está en su confirmación inicial y no puede usar git reset, simplemente declare "bancarrota Git" y elimine la .gitcarpeta y comience de nuevo

Ana Betts
fuente
55
Un consejo es copiar su archivo .git / config si ha agregado el origen remoto, antes de eliminar la carpeta.
Tiago
44
El comentario de @ChrisJohnsen es perfecto. A veces, desea confirmar todos los archivos excepto uno: git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit' (Esto también funciona cuando no hay confirmaciones anteriores, Failed to resolve 'HEAD'problema re )
57

Según muchas de las otras respuestas, puede usar git reset

PERO:

Encontré esta gran publicación que realmente agrega el comando Git (bueno, un alias) para git unadd: ver git unadd para más detalles o ...

Simplemente,

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

Ahora usted puede

git unadd foo.txt bar.txt
electblake
fuente
45

Úselo git add -ipara eliminar archivos recién agregados de su próxima confirmación. Ejemplo:

Agregar el archivo que no quería:

$ 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)
# [...]#

Entrando en el complemento interactivo para deshacer su complemento (los comandos escritos aquí en git son "r" (revertir), "1" (la primera entrada en la lista muestra revertir), 'return' para salir del modo revertir y "q" (dejar):

$ 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.
$

¡Eso es! Aquí está su prueba, que muestra que "foo" está de vuelta en la lista sin seguimiento:

$ 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)
$
Alex North-Keys
fuente
42

git removeo git rmpuede usarse para esto, con la --cachedbandera. Tratar:

git help rm
GNUD
fuente
99
¿Esto no va a eliminar el archivo por completo?
Willa
8
git rm --cached ...eliminará archivos de un repositorio de git. Todavía existirán en su computadora, pero esto es MUY diferente de los cambios no escalonados en un archivo. Para cualquiera que se encuentre con esto, no es una respuesta válida a la pregunta.
Addison
38

Aquí hay una manera de evitar este molesto problema cuando comienza un nuevo proyecto:

  • Cree el directorio principal para su nuevo proyecto.
  • Ejecutar git init.
  • Ahora cree un archivo .gitignore (incluso si está vacío).
  • Confirma tu archivo .gitignore.

Git hace que sea realmente difícil hacerlo git resetsi no tienes ninguna confirmación. Si crea una pequeña confirmación inicial solo por el hecho de tener una, después de eso puede hacerlo git add -Ay git resettantas veces como desee para hacer todo bien.

Otra ventaja de este método es que si luego se encuentra con problemas de final de línea y necesita actualizar todos sus archivos, es fácil:

  • Echa un vistazo a esa confirmación inicial. Esto eliminará todos tus archivos.
  • Luego revise su confirmación más reciente nuevamente. Esto recuperará nuevas copias de sus archivos, utilizando su configuración actual de final de línea.
Ryan Lundy
fuente
1
¡Confirmado! Intenté restablecer git después de agregar git. y git se quejaba de la CABEZA corrupta. Siguiendo su consejo, podría agregar y restablecer sin problemas :)
Kounavi
1
La segunda parte funciona, pero es un poco torpe. La forma en que se manejan los finales de línea depende del autocrlfvalor ... Esto no funcionará en todos los proyectos, dependiendo de la configuración.
sjas
1
Esta respuesta fue razonable en el momento en que se publicó, pero ahora está obsoleta; git reset somefiley git resetambos trabajan antes de hacer el primer commit, ahora. Este ha sido el caso desde varios lanzamientos de Git.
Mark Amery
@ MarkAmery, puede que tengas razón (sería genial si publicaras una fuente para tu afirmación), pero aún hay valor en comenzar tu repositorio con una confirmación limpia o dos.
Ryan Lundy
34

Tal vez Git ha evolucionado desde que publicaste tu pregunta.

$> git --version
git version 1.6.2.1

Ahora puedes probar:

git reset HEAD .

Esto debería ser lo que estás buscando.

Kokotte23
fuente
2
Claro, pero luego tiene la pregunta de seguimiento de cómo se debe agregar uno de los dos (o más) archivos agregados. Sin embargo, el manual "git reset" menciona que "git reset <paths>" es lo contrario de "git add <paths>".
Alex North-Keys
34

Tenga en cuenta que si no puede especificar una revisión, debe incluir un separador. 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 versión 1.7.5.4)

Powlo
fuente
2
Lo intenté git reset <path>y funciona bien sin un separador. También estoy usando git 1.9.0. ¿Quizás no funciona en versiones anteriores?
31

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 nuevos archivos agregados accidentalmente.

Corrió
fuente
44
Tenga en cuenta que aquí --cachedes una parte realmente importante.
takeshin
1
-1; no, esto no elimina la etapa del archivo, sino que elimina el archivo (sin eliminarlo de su árbol de trabajo).
Mark Amery
25

Para restablecer cada archivo en una carpeta particular (y sus subcarpetas), puede usar el siguiente comando:

git reset *
Zorayr
fuente
44
En realidad, esto no restablece todos los archivos porque * usa la expansión de shell e ignora los archivos de puntos (y los directorios de puntos).
Luc
Puede ejecutar git statuspara ver cualquier cosa restante y restablecerlo manualmente, es decir git reset file.
Zorayr
25

Use el *comando para manejar múltiples archivos a la vez:

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

etc.

boulder_ruby
fuente
3
Tenga en cuenta que * generalmente no incluirá archivos de puntos o 'directorios de puntos' a menos que especifique explícitamente .*o.*.prj
Luc
23

Simplemente git resetescríbalo volverá atrás y es como si nunca hubiera escrito git add .desde su última confirmación. Asegúrese de haberse comprometido antes.

Donovan
fuente
Como sucede, hubo una última confirmación ... pero estaba preguntando específicamente sobre la eliminación de un solo archivo de la confirmación, no todos los archivos de la confirmación.
paxos1977
20

Supongamos que creo un nuevo archivo newFile.txt:

Ingrese la descripción de la imagen aquí

Supongamos que agrego el archivo accidentalmente git add newFile.txt:

Ingrese la descripción de la imagen aquí

Ahora quiero deshacer este complemento, antes de confirmar git reset newFile.txt:

Ingrese la descripción de la imagen aquí

Vidura Mudalige
fuente
Supongamos que estoy en la primera foto, lo que significa que ni siquiera hice "git.add". Además, no quiero nada de todo este cambio. Quiero decir que cuando hago el estado de git, no debería mostrar ningún archivo rojo. Quiero decir que debería estar sincronizado como si no hubiera un solo archivo alterado desde el último empuje de git. cómo lograr eso.
Irrompible el
Así que supongamos que estás en el primer paso. Y desea deshacerse de todos los cambios que ha realizado, lo que hace que "newFile.txt" aparezca en rojo.
Irrompible el
Cuando hago git status. No debería ver ningún cambio en absoluto. Todos los archivos rojos deberían revertirse.
Irrompible el
Hola, creo que tu pregunta es cómo eliminar archivos no rastreados del árbol actual. Para eso, puedes usar "git clean -f -d". Esto eliminará los directorios no rastreados también.
Vidura Mudalige
Si no desea eliminar los archivos no rastreados, simplemente ignore el indicador "-f".
Vidura Mudalige
19

Para un archivo específico:

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

Para todos los archivos agregados:

  • git reset
  • Git Checkout.

Nota: el pago cambia el código en los archivos y pasa al último estado actualizado (comprometido). restablecer no cambia los códigos; solo restablece el encabezado.

Hasib Kamal
fuente
3
Por favor explique la diferencia entre git reset <file>y git checkout <file>.
Trent el
1
reset no cambia el archivo, solo lo pone fuera del escenario (= índice, donde fue colocado por git add)
franco
pago cambia los códigos en el archivo y pasa al último estado actualizado. reset no cambia los códigos, solo restablece el encabezado. Como ejemplo, restablezca el uso de los archivos agregados o confirmados que se restablecen antes del uso push y checkout para volver a la última etapa actualizada / confirmada antes de git add.
Hasib Kamal
1
reset = eliminar el archivo de la etapa, sin embargo, los cambios seguirán allí. checkout = obtiene el archivo actualizado del repositorio y anula el archivo actual
Imam Bux
14

Este comando eliminará sus cambios:

git reset HEAD filename.txt

También puedes usar

git add -p 

para agregar partes de archivos.

wallerjake
fuente
14

También hay modo interactivo:

git add -i

Elija la opción 3 para eliminar archivos. En mi caso, a menudo quiero agregar más de un archivo, y con el modo interactivo puede usar números como este para agregar archivos. Esto tomará todo menos 4: 1, 2, 3 y 5

Para elegir una secuencia, simplemente escriba 1-5 para tomar todo del 1 al 5.

Archivos de preparación Git

Jonathan
fuente
"Me sorprende que nadie mencione el modo interactivo" - lo hicieron: stackoverflow.com/a/10209776/1709587
Mark Amery
14

Para deshacer git add, use:

git reset filename
Anirudh Sood
fuente
10
git reset filename.txt

Eliminará un archivo llamado filename.txt del índice actual, el área "a punto de confirmarse", sin cambiar nada más.

Rahul Sinha
fuente
10

git add myfile.txt # Esto agregará su archivo a la lista de compromisos

Muy opuesto a este comando es,

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

entonces, estarás en el estado anterior. Se especificará nuevamente en la lista sin seguimiento (estado anterior).

Se restablecerá la cabeza con ese archivo especificado. entonces, si su cabeza no tiene los medios, simplemente lo restablecerá.

Mohideen bin Mohammed
fuente
9

En Sourcetree puede hacerlo fácilmente a través de la GUI. Puede verificar qué comando usa Sourcetree para quitar el escenario de un archivo.

Creé un nuevo archivo y lo agregué a Git. Luego lo desestimé usando la GUI de Sourcetree. Este es el resultado:

Desinstalar archivos [12/08/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - ruta / a / archivo / nombre de archivo.java

Sourcetree utiliza resetpara desestabilizar nuevos archivos.

miva2
fuente
Sí, la misma técnica se puede usar con TortoiseGit , obteniendo los comandos Git para los casos de uso comunes.
Peter Mortensen el
8
git reset filename.txt  

Eliminará un archivo llamado filename.txt del índice actual, el área "a punto de confirmarse", sin cambiar nada más.

Joseph Mathew
fuente
git reset [nombre de archivo] ej: git reset src / main / java / com / dao / ImportCsvDataDaoImpl.java
Rohit Chaurasiya