Comment supprimer des fichiers de la zone de transit Git?

552

J'ai apporté des modifications à certains de mes fichiers dans mon référentiel local, puis j'ai fait git add -Ace qui, je pense, a ajouté trop de fichiers à la zone de transfert. Comment supprimer tous les fichiers de la zone de transit?

Après cela, je le ferai manuellement git add "filename".

oméga
la source
2
J'espère que vous recherchez ceci: stackoverflow.com/questions/1505948/…
sumitb.mdi
27
git statusvous indique déjà exactement quoi faire si vous souhaitez décompresser des fichiers.
Michael Foukarakis
6
@MichaelFoukarakis git status n'est pas aussi utile si vous souhaitez supprimer un répertoire entier s'il inonde le terminal de sortie (comme node_modules)
whiterook6
2
À l'avenir, au lieu d'ajouter tout, vous voudrez peut-être vous familiariser avec git add -pou git add --patch(ce sont les mêmes). Cet indicateur vous permet de sélectionner de manière interactive les fichiers ou les modifications individuelles que vous souhaitez mettre en scène - vous pouvez ensuite obtenir beaucoup plus finement le travail que vous incluez dans la validation.
Gabe

Réponses:

691

Vous pouvez décompresser des fichiers de l'index à l'aide de

git reset HEAD -- path/to/file

Tout comme git add, vous pouvez décompresser les fichiers de manière récursive par répertoire, etc.

git reset HEAD -- .

De plus, pour référence future, la sortie de git statusvous indiquera les commandes à exécuter pour déplacer des fichiers d'un état à un autre.

Ash Wilson
la source
5
$ git reset HEAD -- .produit fatal: Failed to resolve 'HEAD' as a valid ref.Notez que je n'ai jamais fait de commit; c'est le premier git addaprèsgit init
Patrizio Bertoni
5
Vous pouvez également utiliser git reset @.
alex
@alex Est-ce mieux que tout simplement git reset?
Antony Hatchkins
7
@AntonyHatchkins @est synonyme de HEAD.
alex
Totalement travaillé pour moi, merci!
wayneseymour
306

Utilisation

git reset

pour démasquer tous les fichiers intermédiaires.

Antony Hatchkins
la source
3
Puis-je demander en quoi cela diffère git reset HEAD --ou s'agit-il simplement d'une manière plus succincte d'effectuer la même opération?
ProNotion
1
@ProNotion Reset utilise HEADpar défaut. Quel est le but de ceux qui sont --en vous git reset HEAD --?
Antony Hatchkins
@AntonyHatchkins, il aurait dû être suivi d'un point final (point) et a été repris de l'exemple de la réponse acceptée.
ProNotion
11
@ProNotion Désolé de vous avoir mal compris. git reset HEAD -- .est différent en ce qu'il ne réinitialise que les fichiers dans le répertoire en cours et en dessous tout en git resetréinitialise tous les fichiers du projet.
Antony Hatchkins
101

Si vous avez déjà validé un tas de fichiers indésirables, vous pouvez les supprimer et dire à git de les marquer comme supprimés (sans les supprimer réellement) avec

git rm --cached -r .

--cachedlui dit de supprimer les chemins de la mise en scène et de l'index sans supprimer les fichiers eux-mêmes et -ropère sur les répertoires de manière récursive. Vous pouvez ensuite git addtous les fichiers que vous souhaitez suivre.

Max
la source
Je suppose que c'est "git rm -."
Alexander Mills,
1
il y a une erreur fatale de ne pas supprimer les fichiers avec "git rm -."
Alexander Mills
@AlexMills Je mets à jour ma réponse pour mentionner les options réelles pour rmdésinstaller tous les fichiers.
Max
2
J'ai essayé ceci sur un fichier singulier comme celui-ci: "git rm --cached my / file.java" et je vois ce fichier toujours dans la zone de transit, mais comme supprimé! @Max lorsque vous exécutez cette commande, vos fichiers sont-ils réellement supprimés ou simplement non mis en scène? Si vous ne recherchez pas ce comportement, j'irais avec une réponse.
OrwellHindenberg
@OrwellHindenberg merci d'avoir signalé cela! --cachedest vraiment d'arrêter le suivi des fichiers que vous avez déjà validés. Le fichier n'est donc pas réellement supprimé, mais git le pense. J'ai clarifié cela dans ma réponse.
Max
30

Vous pourriez utiliser

git reset HEAD

puis ajoutez les fichiers spécifiques que vous souhaitez avec

git add [directory/]filename
Alose
la source
Vous pouvez ajouter le paramètre -x et les fichiers ignorés seront également supprimés. C'est utile si vous vous trompez avec votre .gitignore et que vous avez quelque chose d'utile (comme dans mon cas). ( git-scm.com/docs/git-clean )
Keeprock
1
Avec les dossiers en excès, git statusvous dira que le répertoire de travail est propre - mensonges! git clean -dfa fait ce travail, merci.
Leo
5
Notez que git clean -dfcela supprimera définitivement les fichiers. Sur les systèmes de type UNIX, il appellera unlink()et vos fichiers supprimés ne seront pas récupérables.
Hanxue
11
L'OP demande de supprimer les fichiers. Vous lui conseillez de supprimer les fichiers. Je vous suggère de lire ce qu'est la zone de transit avant de répondre.
Antony Hatchkins du
Merci d'avoir supprimé l'intégralité de mon projet non enregistré.
Vansuita Jr.,
7

Comme indiqué dans d'autres réponses, vous devez utiliser git reset. Cela annulera l'action du git add -A.

Remarque: git reset est équivalent à git reset --mixedce que cela fait

Réinitialise l'index mais pas l'arborescence de travail (c'est-à-dire que les fichiers modifiés sont conservés mais pas marqués pour validation) et signale ce qui n'a pas été mis à jour. Il s'agit de l'action par défaut. [ git reset ]

Dan Rosenstark
la source
2
.. et pour supprimer un seul fichier de la zone de git reset filenameToNotCommit
transit
5

Maintenant à v2.24.0 suggère

git restore --staged .

pour supprimer les fichiers.

norixxx
la source
1

Vous pouvez réinitialiser la zone de transit de plusieurs manières:

  1. Réinitialisez HEAD et ajoutez tous les fichiers nécessaires à l'enregistrement comme ci-dessous:

     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 
    
Amit Kaneria
la source
Qu'est-ce qui rend cette réponse différente des six réponses existantes?
Antony Hatchkins
1

Pour supprimer tous les fichiers de la zone de transit, utilisez -
git reset
Pour supprimer l'utilisation de fichiers spécifiques -
git reset "File path"

Akash Bisariya
la source
1

utilisation

git reset HEAD

Cela supprimera tous les fichiers de la zone de transit

Ajith
la source
1

Si des fichiers indésirables ont été ajoutés à la zone de transfert mais pas encore validés, une simple réinitialisation fera le travail:

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

Pour supprimer uniquement les modifications non mises en scène dans le répertoire de travail actuel, utilisez:

git checkout -- .
Vlad Bezden
la source
0

Utilisez " git reset HEAD <file>..." pour déchaîner les fils

ex: pour démasquer tous les fichiers

git reset HEAD .

pour déchaîner un fichier

git reset HEAD nameFile.txt
Amirouche Zeggagh
la source
-3

J'ai essayé toutes ces méthodes mais aucune n'a fonctionné pour moi. J'ai supprimé le fichier .git en utilisant la rm -rf .gitforme du dépôt local, puis de nouveau fait git initet git addet les commandes de routine. Ça a marché.

Bhaskar Dhariyal
la source
4
Lire les git docs est généralement plus gratifiant que de suivre les conseils de xkcd.com/1597 ;)
Antony Hatchkins
1
Peut-être que vous aviez un problème d'intégrité dans votre cas spécifique et que c'était l'option laissée, mais ce n'est pas recommandé.
Shad
Veuillez ne pas faire cela, vous détruirez l'intégralité de votre dépôt git.
Lennart Rolland du
-5

La meilleure façon d'annuler votre fichier qui se trouve déjà dans la zone de transfert est git reset --hard qui ramène vos fichiers transférés . Attention maintenant, cela supprimera les modifications échelonnées et non échelonnées.

données de pix
la source
2
C'est faux et dangereux !!! OP souhaite "simplement ajouter manuellement" les fichiers à nouveau par la suite, mais les --hardsupprime pour toujours.
Antony Hatchkins