412 votes

Comment supprimer un fichier de l'index dans git ?

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

6 votes

Voulez-vous dire "rétablir ce qui était là avant" ou "supprimer, car je ne veux plus de ce fichier" ?

1 votes

Dans mon cas, c'est la même chose car le fichier n'existait pas avant...

0 votes

@hcs42 la réponse acceptée est fausse et entraînera la suppression de fichiers pour de nombreuses personnes. La deuxième réponse la plus populaire ( git reset <file> ) est correcte. Vous serait-il possible de déplacer la coche verte vers la bonne réponse ?

575voto

John Feminella Points 116878

Vous voulez :

git rm --cached [file]

Si vous omettez le --cached il le supprimera également de l'arbre de travail. git rm est légèrement plus sûr que git reset car vous serez averti si le contenu mis en scène ne correspond pas à l'extrémité de la branche ou au fichier sur le disque. (Si ce n'est pas le cas, vous devez ajouter la commande --force .)

0 votes

Cela fonctionne également lorsque vous avez des problèmes avec des submodules qui ne sont plus là, alors git status ne fonctionne pas, il continue à se plaindre, cette méthode mentionnée ici résout également ce genre de problème afin que vous puissiez ré-adhérer le submodule.

9 votes

Cela fonctionne aussi très bien si, par exemple, vous avez accidentellement enregistré des fichiers intermédiaires de construction ou des fichiers de configuration locaux qui n'ont pas été inclus dans votre fichier .gitignore ; utilisez git rm --cached pour les supprimer du dépôt, ajoutez les fichiers ou répertoires concernés à .gitignore, mettez en scène et livrez comme d'habitude. Ils seront supprimés du dépôt mais resteront intacts dans votre arborescence locale, et vous ne pourrez pas les archiver à nouveau par accident.

31 votes

Cela supprime également le fichier du repo (distant) après avoir effectué un commit et un push.

152voto

David Underhill Points 9356

Ceci devrait déstocker un <fichier> pour vous (sans supprimer ou modifier le fichier) :

git reset <file>

7 votes

Cela supprime la dernière modification pour le fichier spécifique mais le garde dans le repo (distant) après le commit et le push.

2 votes

Voici la réponse que je cherchais. Notez que vous n'avez pas besoin de spécifier HEAD .

0 votes

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

5voto

Abdul Gafoor Points 785
git reset HEAD <file> 

pour supprimer un fichier particulier de l'index.

et

git reset HEAD

pour supprimer tous les fichiers indexés.

3voto

Ahmmad Ismail Points 383

N'utilisez que git rm --cached [file] pour supprimer un fichier de l'index.

git reset <filename> peut être utilisé pour supprimer les fichiers ajoutés de l'index, à condition que les fichiers soient jamais commis .

% git add First.txt
% git ls-files
First.txt
% git commit -m "First"   
% git ls-files            
First.txt
% git reset First.txt
% git ls-files              
First.txt

NOTE : git reset First.txt n'a aucun effet sur l'index après le commit.

Ce qui m'amène à parler de git restore --staged <file> . Il peut être utilisé pour (vraisemblablement après le premier commit) supprimer les fichiers ajoutés de l'index si les fichiers sont jamais commis .

% git add Second.txt              
% git status        
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    new file:   Second.txt
% git ls-files       
First.txt
Second.txt
% git restore --staged Second.txt
% git ls-files 
First.txt
% git add Second.txt 
% git commit -m "Second"
% git status            
On branch master
nothing to commit, working tree clean
% git ls-files 
First.txt         
Second.txt
Desktop/Test% git restore --staged .
Desktop/Test% git ls-files
First.txt                   
Second.txt
Desktop/Test% git reset .                    
Desktop/Test% git ls-files
First.txt
Second.txt
% git rm --cached -r .
rm 'First.txt'
rm 'Second.txt'
% git ls-files  

tl;dr Regardez les 15 dernières lignes. Si vous ne voulez pas être confondu avec le premier commit, le second commit, avant le commit, après le commit.... utilisez toujours git rm --cached [file]

2voto

nobar Points 5849

En fonction de votre flux de travail, il se peut que vous ayez besoin de ce genre de chose assez rarement 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).

Il suffit d'utiliser 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 à celui de gitk
  • git cola <-- une interface graphique de style plus moderne

Ils vous permettent de déplacer les 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 risquez de perdre des données, ou du moins de les rendre difficiles à retrouver. À moins que vous n'ayez vraiment besoin de faire cela à très haute fréquence, l'utilisation d'un outil GUI est probablement plus sûre .


Travailler sans l'index

D'après les commentaires et les votes, je me suis rendu compte que beaucoup de gens utilisent l'index tout le temps. Ce n'est pas mon cas. Voici comment :

  • Sauvegarder toute ma copie de travail (le cas typique) : git commit -a
  • N'engagez que quelques fichiers : git commit (list of files)
  • Valider tous les fichiers modifiés, sauf quelques uns : git commit -a puis modifier via git gui
  • Examinez graphiquement toutes les modifications apportées à la copie de travail : git difftool --dir-diff --tool=meld

0 votes

Martin : Je suppose que cela dépend de votre flux de travail. Dans mon approche, je n'utilise jamais l'index directement. Quand je veux sauvegarder mon travail, je fais juste des commits complets avec git commit -a . Quand je répondais à cette question, c'était parce que j'avais fait (un exotisme) ". choix inverse de la cerise "qui place les fichiers dans l'index pour vous, mais je voulais modifier un fichier avant de le valider. J'ai retiré le fichier de l'index pendant que je l'éditais afin que les diffs fonctionnent de la manière à laquelle je suis habitué.

0 votes

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 à master ; fusionner ; ops, ajouter le mauvais dossier à master, l'ajouter à gitignore ; les fichiers ne seraient pas supprimés du commit -- il est vrai qu'une meilleure solution serait d'utiliser simplement rm tout de suite mais j'ai d'abord pensé que changer de branche ne tuerait pas le ignoré dossier. mais ... J'utilise l'outil github "basé sur le gui" qui est assez bon pour moi et qui supporte une certaine gestion de l'index sauf qu'il ne supporte pas ceci. alors quoi, dois-je utiliser 2 gui pour un usage étroit ? je ne suis toujours pas d'accord avec la réponse.

0 votes

@cregox : Je ne sais pas ce qu'il en est des autres plates-formes, mais sur les distributions Linux classiques, il est trivial d'installer ces outils GUI bonus - et ils peuvent être utiles à d'autres fins également. Dans tous les cas, c'est juste une autre option pour les personnes qui préfèrent une approche visuelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X