¿Cómo elimino un solo archivo del área de preparación (deshacer git add)?

1232

Situación: tengo un repositorio Git con archivos que ya están en el índice. Realizo cambios en varios archivos, abro Git y agrego estos archivos a mi área de preparación con "git add".

Pregunta: ¿Cómo elimino uno de esos archivos del área de preparación pero no lo elimino del índice o deshago los cambios en el archivo?

PHLAK
fuente
40
El área de preparación es el índice, por lo que quizás podría aclarar exactamente lo que quiere decir.
CB Bailey
Posible duplicado de ¿Cómo deshacer 'git add' antes de confirmar?
TungstenX

Respuestas:

1903

Si entiendo la pregunta correctamente, simplemente desea "deshacer" lo git addque se hizo para ese archivo.

Si necesita eliminar un solo archivo del área de preparación, use

git reset HEAD -- <file>

Si necesita eliminar un directorio (carpeta) completo del área de preparación, use

git reset HEAD -- <directoryName>

Sus modificaciones serán guardadas. Cuando ejecute git statusel archivo, una vez más aparecerá como modificado pero aún no preparado.

Vea la git resetpágina del manual para más detalles.

Tim Henigan
fuente
41
Gracias ... acabo de notar que eso se indica justo encima de los archivos almacenados. Supongo que he estado mirando esa pantalla tanto tiempo que elegí selectivamente lo que quería ver.
PHLAK 01 de
2
Esto desestabiliza todos mis cambios, en contra de todos los consejos que he recibido en cualquier lugar (páginas de manual, aquí, amigos, etc.). Sigo pensando que algún día hará lo que se anuncia, pero no.
Publicado el
66
¿Hay alguna forma de eliminar archivos de la puesta en escena cuando no ha habido confirmaciones para el repositorio?
Jared Forsyth
3
Sigo yendo y viniendo a esta pregunta. ¿Por qué no puedo votarlo más veces? :)
Puce
3
@Jared Forsyth Para eliminar un archivo que nunca se confirmó desde el escenario, use el comando git rm --cached FILEcomo sugiere otra respuesta.
chmike
151
git rm --cached FILE

,

git rm -r --cached CVS */CVS
usuario335425
fuente
28
es cierto, pero git resetcreo que es mejor usarlo aquí, ya que puede omitir la opción --chached y ponerse triste rápidamente usando el git rmcomando :-) Con git resetel lado seguro, si olvida agregar "alguna opción" mantenga el cambio para que sea "más seguro" para el uso diario (estoy hablando git reset --hard).
Konrad 'ktoso' Malawski
20
Este método es útil si no tiene confirmaciones anteriores.
SomeKittens
2
git rm --cached FILEelimina el archivo por etapas, sin eliminar el archivo del árbol de trabajo. Esto es diferente a la pregunta, que era sobre deshacer git add.
Sampo Smolander
1
Esta respuesta arroja un error si ha eliminado el archivo del árbol de trabajo.
Samuel Robert
3
git rm --cachedhará que el archivo se elimine del índice, es decir, el archivo se convertirá en un archivo sin seguimiento . No creo que esto sea lo que OP quiere. Consulte un hilo relacionado aquí: stackoverflow.com/questions/45047810/…
smwikipedia
88

git reset <file>

Funciona si tienes o no confirmaciones anteriores.

MTS
fuente
53

Entonces, un pequeño ajuste a la respuesta de Tim Henigan: debe usar antes del nombre del archivo. Se vería así:

git reset HEAD -- <file>
GuerrillaNerd
fuente
66
¿Qué hace el --y por qué agregarlo? Lo hice git reset HEAD <file>y funcionó.
Paolo
15
--Es una especie de divisor. En caso de que el nombre del archivo no sea convencional, por ejemplo, ( -fo master) git lo interpretaría como argumento de línea de comando o nombre de rama en lugar de nombre de archivo. Mira aquí
Andrew
3
Esto funcionó para mí donde el comando sin - no se debió a no tener confirmaciones anteriores para ese archivo. Gracias.
Matt
18
git reset filename.txt

Si tiene una modificación en filename.txt, lo agregó a la etapa por error y desea eliminar el archivo de la preparación pero no desea perder los cambios.

Vlad Cioaba
fuente
6

En caso de que solo desee eliminar un subconjunto de los cambios en su archivo, puede usar:

git reset -p

o

git reset -p <file_name>

Este comando es básicamente el reverso de git add -p: solo eliminará los cambios seleccionados del área de preparación. Me resulta extremadamente útil para "agregar" algo que agregué por error.

fede1024
fuente
4

Si desea eliminar archivos que siguen un cierto patrón y lo está usando git rm --cached, también puede usar patrones de archivo glob.

Ver aquí .

thilinarmtb
fuente
2

Usted quiere:

  • Afectar a un solo archivo

  • Eliminar archivo del área de preparación

  • No eliminar un solo archivo del índice

  • No deshagas el cambio en sí

y la solución es

git reset HEAD file_name.ext

o

git reset HEAD path/to/file/file_name.ext
Do Nhu Vy
fuente
2

Cuando lo haces git status, Git te dice cómo quitar el escenario:

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

Así que git reset HEAD <file>funcionó para mí y los cambios no fueron tocados.


fuente
2

Creo que probablemente te confundiste con el concepto de índice , como comentó @CB Bailey:

El área de ensayo es el índice.

Simplemente puede considerar el directorio provisional y el índice como la misma cosa.
Entonces, al igual que la respuesta de @Tim Henigan , supongo:

simplemente desea "deshacer" lo git addque se hizo para ese archivo.



Aquí está mi respuesta:

Comúnmente, hay dos formas de deshacer una operación de escenario , como otras respuestas ya mencionadas:

git reset HEAD <file>

y

git rm --cached <file>

Pero, ¿cuál es la diferencia?

Suponga que el archivo se ha preparado y existe también en el directorio de trabajo , úselo git rm --cached <file>si desea eliminarlo del directorio de ensayo y mantenga el archivo en el directorio de trabajo . Pero tenga en cuenta que esta operación no solo eliminará el archivo del directorio de ensayo sino que también lo marcará como deleteden el directorio de ensayo , si utiliza

git status

después de esta operación, verá esto:

        deleted:    <file>

Es un registro de eliminar el archivo del directorio provisional . Si no desea mantener ese registro y simplemente desea deshacer la operación de un archivo en la etapa anterior, usegit reset HEAD <file> en lugar.


-------- FIN DE LA RESPUESTA --------

PD: He notado algunas respuestas mencionadas:

git checkout -- <file>

Este comando es para la situación en la que el archivo se ha preparado , pero el archivo se ha modificado en el directorio de trabajo después de que se haya preparado, utilice esta operación para restaurar el archivo en el directorio de trabajo desde el directorio de ensayo . En otras palabras, después de esta operación, los cambios suceden en su directorio de trabajo , NO en su directorio de ensayo .

Wulfric Lee
fuente
2

Después de la versión 2.23, Git ha introducido el git restorecomando que puede usar para hacer eso. Citando la documentación oficial:

Restaurar rutas especificadas en el árbol de trabajo con algunos contenidos de una fuente de restauración. Si se rastrea una ruta pero no existe en la fuente de restauración, se eliminará para que coincida con la fuente.

El comando también se puede usar para restaurar el contenido en el índice con --staged, o restaurar tanto el árbol de trabajo como el índice con --staged --worktree.

Por lo tanto, puede invocar git restore --staged <path>y desestabilizar el archivo, pero también conservar los cambios que realizó. Recuerde que si el archivo no se organizó, perderá todos los cambios que haya realizado.

Miguel
fuente
2

Para versiones más nuevas de Git hay git restore --staged <file> .

Cuando hago una git statusversión con Git 2.26.2.windows.1, también se recomienda para desestabilizar:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

( Esta publicación muestra que en versiones anteriores git reset HEADse recomendaba en este momento)

Puedo recomendar este post explicando las diferencias entre git revert, git restorey git resetasí como parámetros adicionales para git restore.

Ruik
fuente
1

Si realiza cambios en muchos archivos rastreados pero solo desea organizar algunos de ellos, realice un

git add .

no siempre es favorable (o recomendado), ya que organiza todos los archivos rastreados (algunos casos en los que desea conservar los cambios solo para usted y no desea organizarlos en el repositorio remoto).

ni es ideal hacer un montón de

git add path/to/file1 path/to/file2

si tiene muchos directorios anidados (que es el caso en la mayoría de los proyectos), se vuelve molesto

Ahí es cuando Git GUI es útil (probablemente solo el tiempo que lo uso). Simplemente abra la GUI de Git, muestra secciones de archivos con y sin etapas. Seleccione los archivos de la sección por etapas que desea quitar del escenario y presione

Ctrl+U (para ventanas)

para sacarlos del escenario.

rito2hhh
fuente
0

Mi muestra:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

Como puedes notar

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)
Khang Azun
fuente
-1

Debe estar en el directorio del archivo y luego escribir lo siguiente en el terminal

git reset HEAD .

Se supone que solo debe restablecer un archivo.

nevosial
fuente
-4

Para destrabar todo de una vez, ejecuta este comando

git reset HEAD -- .
Devendra Verma
fuente
No se pueden agregar archivos después de eso.
Karl Morrison el
-10

git checkout -- <file>

Funciona perfectamente para eliminar archivos del área de ensayo

Juan ramirez
fuente
44
como se indica a continuación, esto revierte los cambios en el archivo, que va un paso más allá de lo que OP quiere ir.
stolli
git rm flie.txt --cached
Juan Ramirez
-11

En mi caso, lo hago

git checkout -- FILE
Maxi Capodacqua
fuente
99
Esto revertiría los cambios en el archivo, ¿no?
Martin Burch