Comment supprimer un fichier de l'index dans git?


356

Comment supprimer un fichier de l'index (= zone de transit = cache) sans le supprimer du système de fichiers?


5
Voulez-vous dire "réinitialiser ce qui était là avant" ou "supprimer, parce que je ne veux plus de ce fichier"?
Andrew Aylett

Dans mon cas c'est pareil car le fichier n'existait pas avant ...
hcs42

Réponses:


505

Tu veux:

git rm --cached [file]

Si vous omettez cette --cachedoption, elle sera également supprimée de l'arborescence de travail. git rmest légèrement plus sûr que git reset, car vous serez averti si le contenu mis en scène ne correspond pas à la pointe de la branche ou au fichier sur le disque. (Si ce n'est pas le cas, vous devez ajouter --force.)


8
Cela fonctionne également très bien si, par exemple, vous avez accidentellement archivé certains intermédiaires de construction ou des fichiers de configuration locaux qui ne sont pas entrés dans votre .gitignore; utiliser git rm --cachedpour les supprimer du référentiel, ajouter les fichiers ou répertoires pertinents à .gitignore, mettre en scène et valider normalement. Ils disparaîtront du dépôt mais resteront intacts dans votre arbre local, et vous ne les archiverez plus accidentellement.
Ionoclast Brigham

22
Cela supprime également le fichier du dépôt (distant) après avoir validé et poussé.
powder366

6
Cela ne le supprime pas de l'index, mais le marque comme supprimé dans l'index.
JotaBe

4
Cette réponse est probablement fausse car elle supprime un fichier du dépôt (comme @ powder366 déjà mentionné) qui n'est pas le résultat souhaité.
otomo

1
Cette solution n'a pas fonctionné pour moi. Il a marqué le fichier spécifié comme supprimé, puis le supprime du référentiel local.
paiego

134

Cela devrait supprimer un <fichier> pour vous (sans supprimer ou autrement modifier le fichier):

git reset <file>

6
Cela supprime la dernière modification pour le fichier spécifique mais le conserve dans le référentiel (distant) après validation et push.
powder366

1
C'est la réponse que je cherchais. Notez que vous n'avez pas besoin de spécifier HEAD.
Michael Dorst

Bon point @MichaelDorst. J'ai mis à jour la réponse pour omettre HEAD!
David Underhill

3
git reset HEAD <file> 

pour supprimer un fichier particulier de l'index.

et

git reset HEAD

pour supprimer tous les fichiers indexés.


1

Selon votre flux de travail, cela peut être le genre de chose dont vous avez rarement besoin pour qu'il soit inutile d'essayer de trouver une solution en ligne de commande (à moins que vous ne travailliez sans interface graphique pour une raison quelconque).

Utilisez simplement l'un des outils basés sur l'interface graphique qui prennent en charge la gestion des index, par exemple:

  • git gui <- utilise le cadre de fenêtrage Tk - style similaire à gitk
  • git cola <- une interface graphique de style plus moderne

Ceux-ci vous permettent de déplacer des fichiers dans et hors de l'index par pointer-cliquer. Ils prennent même en charge la sélection et le déplacement de parties d'un fichier (modifications individuelles) vers et depuis l'index.


Que diriez-vous d'une perspective différente: si vous vous trompez en utilisant l'une des commandes suggérées, plutôt cryptiques:

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

... vous avez une réelle chance de perdre des données - ou du moins de les rendre difficiles à trouver. À moins que vous n'ayez vraiment besoin de le faire à très haute fréquence, l' utilisation d'un outil GUI est susceptible d'être plus sûre .


Travailler sans l'index

Sur la base des commentaires et des votes, j'ai réalisé que beaucoup de gens utilisent l'index tout le temps. Je ne. Voici comment:

  • Valider l'intégralité de ma copie de travail (le cas typique): git commit -a
  • N'engagez que quelques fichiers: git commit (list of files)
  • Validez tous les fichiers sauf quelques-uns, git commit -apuis modifiez viagit gui
  • Examinez graphiquement toutes les modifications apportées à la copie de travail: git difftool --dir-diff --tool=meld

@Martin: Je suppose que cela dépend de votre flux de travail. Dans mon approche, je n'utilise jamais directement l'index. Quand je veux sauvegarder mon travail, je fais juste des commits complets avec git commit -a. Lorsque je répondais à cette question, c'était parce que j'avais fait (une exotique) " sélection de cerise inverse " qui met les fichiers dans l'index pour vous, mais je voulais éditer un fichier avant de valider. J'ai retiré le fichier de l'index pendant que je le modifiais pour que les différences fonctionnent comme d'habitude.
2015

mon cas d'utilisation était très étroit et inutile en effet: créer une branche; ajouter un dossier rempli de fichiers pour la branche uniquement; passer en maître; fusionner; ops, ajouté le mauvais dossier au master, ajoutez-le à gitignore; les fichiers ne seraient pas supprimés de la validation - accordé, une meilleure solution serait simplement d'utiliser rmimmédiatement, mais j'ai d'abord pensé que changer de branche ne tuerait pas le dossier ignoré . mais ... J'utilise l'outil github "basé sur gui" qui est assez bon pour moi et supporte une certaine gestion d'index, sauf qu'il ne le supporte pas. alors quoi, dois-je utiliser 2 gui pour une utilisation étroite? ne peut toujours pas être d'accord avec la réponse.
cregox

3
C'est une réponse décidément impopulaire. Cependant, je suis tout à fait sûr que l'approche que je suggère est la bonne pour certaines personnes (moi y compris). J'utilise l'un de ces outils pour manipuler l'index plusieurs fois par an.
nobar

1
De nos jours, les éditeurs de programmation et les IDE sont susceptibles de prendre en charge la manipulation d'index graphique. Au moins l' Atom de GitHub le fait.
nobar

1
Je préfère une interface cli à gui tous les jours, même si c'est plus dangereux. Cela me permettra d'utiliser git même sans gui, ce que je trouve réconfortant (au lieu d'être perdu lorsque je ne peux pas installer de tels outils sur un serveur distant par exemple). Tout cela dit, cette réponse est parfaitement valable et ne mérite pas de downvotes "élite cli", +1 pour avoir fourni une bonne alternative à l'interface graphique!
SidOfc
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.