Come rimuovo un singolo file dall'area di gestione temporanea (annulla git add)?


1232

Situazione: ho un repository Git con file già nell'indice. Apporto le modifiche a più file, apro Git e aggiungo questi file alla mia area di gestione temporanea con "git add".

Domanda: Come posso rimuovere uno di quei file dall'area di gestione temporanea ma non rimuoverlo dall'indice o annullare le modifiche al file stesso?


40
L'area di stadiazione è l'indice, quindi forse potresti chiarire esattamente cosa intendi?
CB Bailey,


Risposte:


1903

Se capisco correttamente la domanda, vuoi semplicemente "annullare" git addciò che è stato fatto per quel file.

Se è necessario rimuovere un singolo file dall'area di gestione temporanea, utilizzare

git reset HEAD -- <file>

Se è necessario rimuovere un'intera directory (cartella) dall'area di gestione temporanea, utilizzare

git reset HEAD -- <directoryName>

Le tue modifiche saranno mantenute. Quando si esegue git statusil file verrà nuovamente visualizzato come modificato ma non ancora in scena.

Vedi la git resetpagina man per i dettagli.


41
Grazie ... ho appena notato che è indicato appena sopra i file organizzati. Immagino che ho guardato quello schermo per così tanto tempo che ho scelto selettivamente quello che volevo vedere.
PHLAK,

2
Questo mette in scena tutte le mie modifiche, contrariamente a tutti i consigli che ho ricevuto ovunque (pagine man, qui, amici, ecc.). Continuo a pensare che un giorno farà ciò che è pubblicizzato, ma no.
rektide,

6
Esiste un modo per rimuovere i file dalla gestione temporanea quando non sono stati eseguiti commit nel repository?
Jared Forsyth,

3
Continuo a venire e venire a questa domanda. Perché non posso votarlo più volte? :)
Puce,

3
@Jared Forsyth Per rimuovere un file che non è mai stato eseguito il commit dallo stage, utilizzare il comando git rm --cached FILEcome suggerito da un'altra risposta.
chmike,

151
git rm --cached FILE

,

git rm -r --cached CVS */CVS

28
vero, ma è meglio usare git resetqui penso, dato che potresti scegliere l'opzione --chached e diventare triste usando il git rmcomando :-) Con git resetla sicurezza, se dimentichi di aggiungere "qualche opzione", mantenere il cambiamento in modo che sia "più sicuro" per l'uso quotidiano (sto parlando git reset --hard).
Konrad 'ktoso' Malawski

20
Questo metodo è utile se non hai precedenti commit.
SomeKittens

2
git rm --cached FILEmette in scena l'eliminazione del file, senza eliminare il file dall'albero di lavoro. Questo è diverso dalla domanda, che riguardava l'annullamento git add.
Sampo Smolander,

1
Questa risposta genera un errore se il file è stato eliminato dall'albero di lavoro.
Samuel Robert,

3
git rm --cachedcauserà la rimozione del file dall'indice, ovvero il file diventerà file non tracciato . Non penso che questo sia ciò che vuole OP. Si prega di consultare un filo correlato qui: stackoverflow.com/questions/45047810/...
smwikipedia

88

git reset <file>

Funziona indipendentemente dal fatto che tu abbia o meno dei precedenti commit.


53

Quindi, una leggera modifica alla risposta di Tim Henigan: è necessario utilizzare - prima del nome del file. Sarebbe così:

git reset HEAD -- <file>

6
Cosa fa --e perché aggiungerlo? L'ho fatto git reset HEAD <file>e ha funzionato.
Paolo

15
--è una specie di divisore. Nel caso in cui il nome del file non sia convenzionale, ad es. ( -fO master) git lo interpreterebbe come argomento della riga di comando o nome del ramo invece del nome del file. Vedi qui
Andrew

3
Questo ha funzionato per me in cui il comando senza - non è dovuto al fatto che non c'erano precedenti commit per quel file. Grazie.
Matt,

18
git reset filename.txt

Se hai una modifica in nomefile.txt, l'hai aggiunta allo stage per errore e vuoi rimuovere il file dalla gestione temporanea ma non vuoi perdere le modifiche.


6

Nel caso in cui desideri solo rimuovere un sottoinsieme delle modifiche al tuo file, puoi utilizzare:

git reset -p

o

git reset -p <file_name>

Questo comando è sostanzialmente il contrario di git add -p: rimuoverà solo le modifiche selezionate dall'area di gestione temporanea. Lo trovo estremamente utile nel "disadattare" qualcosa che ho aggiunto per errore.


4

Se si desidera rimuovere i file seguendo un determinato modello e si sta utilizzando git rm --cached, è possibile utilizzare anche i pattern file-glob.

Vedi qui .


2

Tu vuoi:

  • Riguarda un singolo file

  • Rimuovere il file dall'area di gestione temporanea

  • Non rimuovere un singolo file dall'indice

  • Non annullare la modifica stessa

e la soluzione è

git reset HEAD file_name.ext

o

git reset HEAD path/to/file/file_name.ext

2

Quando lo fai git status, Git ti dice come rimuovere la scena:

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

Quindi ha git reset HEAD <file>funzionato per me e le modifiche non sono state toccate.


2

Penso che probabilmente ti sei confuso con il concetto di indice , come ha commentato @CB Bailey:

L'area di gestione temporanea è l'indice.

Puoi semplicemente considerare la directory di gestione temporanea e l' indice come la stessa cosa.
Quindi, proprio come la risposta di @Tim Henigan , immagino:

vuoi semplicemente "annullare" git addciò che è stato fatto per quel file.



Ecco la mia risposta:

Comunemente, ci sono due modi per annullare un'operazione sul palco , come altre risposte già menzionate:

git reset HEAD <file>

e

git rm --cached <file>

Ma qual è la differenza?

Si supponga che il file sia stato messo in scena ed esista anche nella directory di lavoro , utilizzare git rm --cached <file>se si desidera rimuoverlo dalla directory di gestione temporanea e mantenere il file nella directory di lavoro . Si noti che questa operazione non rimuoverà solo il file dalla directory di gestione temporanea, ma contrassegnerà il file come deletednella directory di gestione temporanea , se si utilizza

git status

dopo questa operazione, vedrai questo:

        deleted:    <file>

È un record di rimozione del file dalla directory di gestione temporanea . Se non si desidera conservare quel record e si desidera semplicemente annullare un'operazione nella fase precedente di un file, utilizzare git reset HEAD <file>invece.


-------- FINE DELLA RISPOSTA --------

PS: ho notato alcune risposte menzionate:

git checkout -- <file>

Questo comando è per la situazione in cui il file è stato messo in scena , ma il file è stato modificato nella directory di lavoro dopo che è stato messo in scena, utilizzare questa operazione per ripristinare il file nella directory di lavoro dalla directory di gestione temporanea . In altre parole, dopo questa operazione, si verificano cambiamenti nella directory di lavoro , NON nella directory di gestione temporanea .


2

Dopo la versione 2.23, Git ha introdotto il git restorecomando che puoi usare per farlo. Citando la documentazione ufficiale:

Ripristina i percorsi specificati nella struttura di lavoro con alcuni contenuti da un'origine di ripristino. Se viene tracciato un percorso ma non esiste nell'origine di ripristino, verrà rimosso per corrispondere all'origine.

Il comando può anche essere utilizzato per ripristinare il contenuto nell'indice con --stagedo ripristinare sia l'albero di lavoro che l'indice con --staged --worktree.

Quindi puoi invocare git restore --staged <path>e annullare la messa in scena del file ma anche mantenere le modifiche apportate. Ricorda che se il file non è stato messo in scena perdi tutte le modifiche apportate al file.


2

Per le versioni più recenti di Git c'è git restore --staged <file>.

Quando eseguo una git statusversione con Git 2.26.2.windows.1, è consigliato anche per la non messa in scena:

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

( Questo post mostra che git reset HEADa questo punto era consigliato nelle versioni precedenti )

Consiglio vivamente questo post che spiega le differenze tra git revert, git restoree git resete anche parametri aggiuntivi per git restore.


1

Se apporti modifiche a molti file tracciati ma desideri solo metterne in scena alcuni, esegui a

git add .

non è sempre favorevole (o consigliato) - in quanto mette in scena tutti i file tracciati (alcuni casi in cui si desidera mantenere le modifiche solo su se stessi e non si desidera trasferirle nel repository remoto).

né è l'ideale fare un sacco di

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

se hai molte directory nidificate (come nella maggior parte dei progetti), diventa fastidioso

Questo è quando Git GUI è utile (probabilmente solo quando la uso). Basta aprire Git GUI, mostra sezioni di file gestite e non messe in scena. Selezionare i file dalla sezione graduale che si desidera rimuovere dalla scena e premere

Ctrl+U (per windows)

per metterli in scena.


0

Il mio campione:

$ 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

Come puoi notare

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

-1

Devi essere nella directory del file e quindi digitare quanto segue nel terminale

git reset HEAD .

Il presupposto è che è necessario ripristinare un solo file.



-10

git checkout -- <file>

Funziona perfettamente per rimuovere i file dall'area di gestione temporanea


4
come indicato di seguito, questo ripristina le modifiche al file, che sta andando un passo oltre quanto OP vuole andare.
Stolli

git rm flie.txt --cached
Juan Ramirez

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.