Come rimuovere un file dall'indice in git?


356

Come rimuovere un file dall'indice (= area di gestione temporanea = cache) senza rimuoverlo dal file system?


5
Vuoi dire "ripristina ciò che c'era prima" o "elimina, perché non voglio più quel file"?
Andrew Aylett,

Nel mio caso è lo stesso perché il file non esisteva prima ...
hcs42

Risposte:


505

Tu vuoi:

git rm --cached [file]

Se si omette l' --cachedopzione, verrà eliminata anche dall'albero di lavoro. git rmè leggermente più sicuro di git reset, perché verrai avvisato se il contenuto messo in scena non corrisponde alla punta del ramo o al file sul disco. (In caso contrario, è necessario aggiungere --force.)


8
Funziona alla grande anche se, ad esempio, hai accidentalmente archiviato alcuni intermedi di build o file di configurazione locali che non sono stati inseriti nel tuo .gitignore; utilizzare git rm --cachedper rimuoverli dal repository, aggiungere i file o le directory pertinenti a .gitignore, stage e commit come di consueto. Saranno andati via dal repository ma rimarranno intatti nel tuo albero locale e non li controllerai di nuovo accidentalmente.
Ionoclast Brigham

22
Ciò elimina anche il file dal repository (remoto) dopo aver eseguito il commit e il push.
powder366

6
Questo non lo rimuove dall'indice, ma lo contrassegna come eliminato nell'indice.
Jota Be

4
Questa risposta è probabilmente errata poiché rimuove un file dal repository (come già indicato da @ powder366) che non è il risultato previsto.
otomo,

1
Questa soluzione non ha funzionato per me. Ha contrassegnato il file specificato come eliminato, quindi lo rimuove dal repository locale.
paiego

134

Questo dovrebbe mettere in scena un <file> per te (senza rimuovere o modificare in altro modo il file):

git reset <file>

6
Questo rimuove l'ultima modifica per il file specifico ma lo mantiene nel repository (remoto) dopo il commit e il push.
powder366

1
Questa è la risposta che stavo cercando. Si noti che non è necessario specificare HEAD.
Michael Dorst,

Buon punto @MichaelDorst. Ho aggiornato la risposta per omettere HEAD!
David Underhill,

3
git reset HEAD <file> 

per rimuovere un determinato file dall'indice.

e

git reset HEAD

per rimuovere tutti i file indicizzati.


1

A seconda del flusso di lavoro, questo potrebbe essere il tipo di cose di cui hai bisogno raramente abbastanza da avere poco senso nel cercare di trovare una soluzione da riga di comando (a meno che non ti capiti di lavorare senza un'interfaccia grafica per qualche motivo).

Basta usare uno degli strumenti basati sulla GUI che supportano la gestione degli indici, ad esempio:

  • git gui <- usa il framework per finestre Tk - stile simile a gitk
  • git cola <- un'interfaccia grafica più moderna

Questi ti consentono di spostare i file dentro e fuori dall'indice puntando e facendo clic. Hanno anche il supporto per la selezione e lo spostamento di parti di un file (singole modifiche) da e verso l'indice.


Che ne dici di una prospettiva diversa: se sbagli mentre usi uno dei comandi suggeriti, piuttosto criptici,:

  • git rm --cached [file]
  • git reset HEAD <file>

... hai una reale possibilità di perdere dati - o almeno renderlo difficile da trovare. A meno che non sia necessario farlo con una frequenza molto elevata, è probabile che l'utilizzo di uno strumento GUI sia più sicuro .


Lavorare senza l'indice

Sulla base dei commenti e dei voti, ho capito che molte persone usano l'indice continuamente. Io non. Ecco come:

  • Conferma la mia intera copia di lavoro (il caso tipico): git commit -a
  • Impegna solo alcuni file: git commit (list of files)
  • Esegui il commit di tutti tranne alcuni file modificati: git commit -aquindi modifica tramitegit gui
  • Esamina graficamente tutte le modifiche alla copia di lavoro: git difftool --dir-diff --tool=meld

@Martin: immagino che dipenda dal tuo flusso di lavoro. Nel mio approccio, non uso mai direttamente l'indice. Quando voglio salvare il mio lavoro, mi impegno a fondo git commit -a. Quando stavo rispondendo a questa domanda, era perché avevo fatto (un esotico) " pick inverso alla ciliegia " che metteva i file nell'indice per te, ma volevo modificare un file prima di impegnarmi. Ho rimosso il file dall'indice mentre l'ho modificato in modo che le differenze funzionassero come sono abituato.
nobar,

il mio caso d'uso era molto ristretto e davvero inutile: creare un ramo; aggiungi cartella piena di file solo per ramo; passare al master; fondersi; ops, aggiunta cartella errata al master, aggiunta a gitignore; i file non sarebbero stati rimossi da commit - garantito, una soluzione migliore sarebbe quella di usarli rmimmediatamente, ma ho pensato che il cambio di ramo non avrebbe ucciso la cartella ignorata . ma ... uso lo strumento "gui based" di github che è abbastanza buono per me e supporto un po 'di gestione dell'indice, tranne che non supporta questo. quindi cosa devo usare 2 gui per un uso limitato? non riesco ancora a concordare con la risposta.
Cregox,

3
Questa è una risposta decisamente impopolare. Tuttavia, sono abbastanza sicuro che l'approccio che suggerisco sia quello giusto per alcune persone (me compreso). Uso uno di questi strumenti per manipolare l'indice alcune volte all'anno.
nobar,

1
Oggi è probabile che gli editor di programmazione e gli IDE supportino la manipolazione grafica dell'indice. Almeno Atom di GitHub lo fa.
Nobar

1
Preferisco un'interfaccia cli rispetto alla gui ogni giorno anche se è più pericolosa. Mi permetterà di usare git anche senza gui che trovo confortante (invece di perdersi quando non posso installare tali strumenti su un server remoto per esempio). Tutto ciò che ha detto che questa risposta è perfettamente valida e non merita i voti "elitari dei cli", +1 per fornire una buona alternativa alla gui!
SidOfc
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.