Come rimuovere i file dall'area di staging di Git?


551

Ho apportato modifiche ad alcuni dei miei file nel mio repository locale e poi l'ho fatto, git add -Ache credo abbia aggiunto troppi file all'area di gestione temporanea. Come posso eliminare tutti i file dall'area di gestione temporanea?

Dopo averlo fatto, lo farò solo manualmente git add "filename".


2
Speriamo che si sta cercando questo: stackoverflow.com/questions/1505948/...
sumitb.mdi

27
git statusti dice già esattamente cosa fare se vuoi mettere in scena i file.
Michael Foukarakis,

6
Lo stato git di @MichaelFoukarakis non è così utile se si desidera annullare la messa in scena di un'intera directory se inonda il terminale di output (come node_modules)
whiterook6,

2
In futuro, invece di aggiungere tutto, potresti voler metterti comodo git add -po git add --patch(sono gli stessi). Quel flag ti consente di selezionare in modo interattivo quali file o singole modifiche vuoi mettere in scena - puoi quindi ottenere molto più finemente dettagliato con il lavoro che includi nel commit.
Gabe,

Risposte:


691

È possibile rimuovere la messa in scena dei file dall'indice utilizzando

git reset HEAD -- path/to/file

Proprio come git add, è possibile rimuovere in modo ricorsivo i file in modo ricorsivo per directory e così via, quindi per annullare la messa in scena di tutto in una volta, eseguirlo dalla directory principale del repository:

git reset HEAD -- .

Inoltre, per riferimento futuro, l'output di git statusti dirà i comandi che devi eseguire per spostare i file da uno stato all'altro.


5
$ git reset HEAD -- .prodotto fatal: Failed to resolve 'HEAD' as a valid ref.Nota che non ho mai fatto alcun commit; è il primo git adddopogit init
Patrizio Bertoni il

5
Puoi anche usare git reset @.
alex,

@alex È meglio della semplice git reset?
Antony Hatchkins,

7
@AntonyHatchkins @è sinonimo di HEAD.
alex,

Totalmente lavorato per me, grazie!
wayneseymour,

305

Uso

git reset

per mettere in scena tutti i file messi in scena.


3
Posso chiederti in che modo differisce git reset HEAD --o è semplicemente un modo più conciso di eseguire la stessa operazione?
ProNotion

1
@ProNotion Reset utilizza HEADper impostazione predefinita. Qual è lo scopo di quelli --nel tuo git reset HEAD --?
Antony Hatchkins,

@AntonyHatchkins avrebbe dovuto essere seguito da un punto (punto) ed è stato preso dall'esempio nella risposta accettata.
ProNotion

11
@ProNotion Mi dispiace di averti frainteso. git reset HEAD -- .è diverso in quanto reimposta solo i file nella directory corrente e in basso mentre git resetreimposta tutti i file nel progetto.
Antony Hatchkins,

101

Se hai già eseguito il commit di un sacco di file indesiderati, puoi metterli in scena e dire a git di contrassegnarli come eliminati (senza eliminarli effettivamente) con

git rm --cached -r .

--cachedgli dice di rimuovere i percorsi dalla stadiazione e dall'indice senza rimuovere i file stessi e -ropera ricorsivamente su directory. È quindi possibile git addqualsiasi file che si desidera tenere traccia.


Suppongo che sia "git rm -."
Alexander Mills,

1
c'è un errore fatale nel non rimuovere i file con "git rm -."
Alexander Mills,

@AlexMills Ho aggiornato la mia risposta per menzionare le opzioni effettive per la messa rmin scena di tutti i file.
Max

2
Ho provato questo su un singolo file come questo: "git rm --cached my / file.java" e vedo quel file ancora nell'area di gestione temporanea, ma come cancellato! @Max quando esegui questo comando i tuoi file vengono effettivamente eliminati o semplicemente non messi in scena? Se non stai cercando quel comportamento, vorrei rispondere.
OrwellHindenberg,

@OrwellHindenberg grazie per averlo sottolineato! --cachedè davvero per interrompere il tracciamento dei file che hai già eseguito il commit. Quindi il file non viene effettivamente cancellato, ma git pensa che lo sia. Ho chiarito questo nella mia risposta.
Max

30

Puoi usare

git reset HEAD

quindi aggiungi i file specifici che desideri

git add [directory/]filename

È possibile aggiungere il parametro -x e anche i file ignorati verranno rimossi. È utile se sbagli con il tuo .gitignore e hai qualcosa di utile lì (come nel mio caso). ( git-scm.com/docs/git-clean )
Keeprock,

1
Con le cartelle in eccesso, git statusti dirà la directory di lavoro pulita - bugie! git clean -dffatto questo lavoro, grazie.
Leone,

5
Si noti che git clean -dfeliminerà i file in modo permanente. Su sistemi simili a UNIX, chiamerà unlink()e i file eliminati non saranno recuperabili.
Hanxue,

11
L'OP chiede di annullare la messa in scena dei file. Gli consigli di cancellare i file. Ti suggerirei di leggere in merito all'area di stadiazione prima di rispondere.
Antony Hatchkins,

Grazie per aver eliminato il mio intero progetto non salvato.
Vansuita Jr.

7

Come indicato in altre risposte, è necessario utilizzare git reset. Questo annullerà l'azione di git add -A.

Nota: git reset è equivalente a quello git reset --mixedche fa questo

Reimposta l'indice ma non l'albero di lavoro (ovvero, i file modificati vengono conservati ma non contrassegnati per il commit) e riporta ciò che non è stato aggiornato. Questa è l'azione predefinita. [ git reset ]


2
.. e per rimuovere un singolo file dall'area di gestione git reset filenameToNotCommit
temporanea

5

Ora a v2.24.0 suggerisce

git restore --staged .

per annullare la messa in scena dei file.


1

È possibile ripristinare l'area di gestione temporanea in diversi modi:

  1. Ripristina HEAD e aggiungi di nuovo tutti i file necessari per il check-in come di seguito:

     git reset HEAD ---> removes all files from the staging area
     git add <files, that are required to be committed>
     git commit -m "<commit message>"
     git push 
    

Cosa rende questa risposta diversa dalle sei risposte esistenti?
Antony Hatchkins,

1

Per rimuovere tutti i file dall'area di gestione temporanea utilizzare -
git reset
Per rimuovere l'uso di file specifici -
git reset "File path"


1

uso

git reset HEAD

Ciò rimuoverà tutti i file dall'area di gestione temporanea


1

Se i file indesiderati sono stati aggiunti all'area di gestione temporanea ma non ancora impegnati, un semplice ripristino farà il lavoro:

$ git reset HEAD file
# Or everything
$ git reset HEAD .

Per rimuovere solo le modifiche non messe in scena nella directory di lavoro corrente, utilizzare:

git checkout -- .

0

Usa " git reset HEAD <file>..." per annullare la messa in scena dei file

es: per annullare la messa in scena di tutti i file

git reset HEAD .

per annullare la messa in scena di un file

git reset HEAD nameFile.txt

-3

Ho provato tutti questi metodi, ma nessuno ha funzionato per me. Ho rimosso il file .git utilizzando rm -rf .gitmodulo il repository locale e poi di nuovo fatto git inited git adde comandi di routine. Ha funzionato.


4
Leggere i documenti git è generalmente più gratificante che seguire i consigli di xkcd.com/1597 ;)
Antony Hatchkins

1
Forse hai avuto un problema di integrità nel tuo caso specifico e questa era l'opzione rimasta, ma non è raccomandata.
Shad

Per favore, non farlo, distruggerai l'intero repository git.
Lennart Rolland,

-5

Il modo migliore per annullare il file che è già presente nell'area di gestione temporanea è git reset --hard che riporta indietro i file di gestione temporanea. Attento ora, che rimuoverà le modifiche graduali e non organizzate.


2
Questo è sbagliato e pericoloso !!! OP desidera "aggiungere nuovamente manualmente" i file in seguito, ma --hardli elimina per sempre.
Antony Hatchkins,
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.