Comment puis-je supprimer un seul fichier de la zone de mise en scène (undo git add)?
-
19-09-2019 - |
Question
Situation: J'ai un dépôt Git avec des fichiers déjà dans l'index. Je fais des modifications à plusieurs fichiers, Git ouvrir et ajouter ces fichiers à ma zone de mise en scène avec « git add. »
Question: Comment puis-je supprimer l'un de ces fichiers de la zone de mise en scène mais pas le supprimer de l'index ou annuler les modifications apportées au fichier lui-même
La solution
Si je comprends bien la question, vous voulez simplement « annuler » le git add
qui a été fait pour ce fichier.
Si vous devez supprimer un de la zone de mise en scène file , utilisez
git reset HEAD -- <file>
Si vous devez supprimer un de la zone de mise en scène répertoire entier (dossier) , utilisez
git reset HEAD -- <directoryName>
Vos modifications seront conservés. Lorsque vous exécutez git status
le fichier sera de nouveau affiché modifié mais pas encore mis en scène.
Voir la git reset
page de manuel pour plus de détails.
Autres conseils
git rm --cached FILE
git rm -r --cached CVS */CVS
git reset <file>
Les travaux si vous avez ou non des commits précédents.
Alors, une légère tweak à la réponse de Tim Henigan: vous devez utiliser - avant le nom du fichier. Il ressemblerait à ceci:
git reset HEAD -- <file>
git reset filename.txt
Si vous avez une modification filename.txt, vous l'avez ajouté à l'étape par erreur et que vous voulez supprimer le fichier de mise en scène, mais vous ne voulez pas perdre les modifications.
Si vous voulez juste supprimer un sous-ensemble des modifications apportées à votre fichier, vous pouvez utiliser:
git reset -p
ou
git reset -p <file_name>
Cette commande est essentiellement l'inverse de git add -p
: il ne supprime les changements sélectionnés dans la zone de transit. Je trouve cela extrêmement utile dans quelque chose « unadding » que j'ajouté par erreur.
Si vous voulez supprimer les fichiers suivant un certain modèle et que vous utilisez git rm --cached
, vous pouvez utiliser des modèles de fichiers glob aussi.
Voir ici .
Vous voulez:
-
affecter à un seul fichier
-
Supprimer le fichier de la zone mise en scène
-
Non supprimer le fichier unique de l'index
-
Ne pas annuler le changement lui-même
et la solution est
git reset HEAD file_name.ext
ou
git reset HEAD path/to/file/file_name.ext
Quand vous faites git status
, Git vous indique comment désindexer:
Changes to be committed: (use "git reset HEAD <file>..." to unstage).
Alors git reset HEAD <file>
a travaillé pour moi et les changements ont été non touché.
Si vous apportez des modifications à plusieurs fichiers mais chenillés ne souhaitez que de mettre en scène quelques-unes d'entre elles, faire un
git add .
est pas toujours favorable (ou recommandé) -. Car il met en scène tous les fichiers chenillés (certains cas où vous souhaitez conserver les modifications que pour vous et ne voulez pas mettre en scène au dépôt distant)
ni idéal faire un tas de
git add path/to/file1 path/to/file2
si vous avez beaucoup de répertoires imbriqués (qui est le cas dans la plupart des projets) - devient ennuyeux
C'est quand GUI Git est utile (temps probablement que je l'utilise). Il suffit d'ouvrir GUI Git, il montre et met en scène les sections de fichiers Unstaged. Sélectionnez les fichiers de la section mise en scène que vous souhaitez désindexer et appuyez sur
Ctrl+U
(pour Windows)
pour les désindexer.
Je pense que vous a probablement été confondu avec le concept d'indice , comme @CB Bailey a commenté:
La zone de mise en scène est l'indice.
Vous pouvez simplement considérer Répertoire mise en scène et indice comme la même chose.
Alors, comme réponse Henigan @ Tim, je suppose:
vous voulez simplement « annuler » le
git add
qui a été fait pour ce fichier.
Voici ma réponse:
Généralement, il y a deux façons d'annuler un étape opération, comme d'autres réponses déjà mentionnées:
git reset HEAD <file>
et
git rm --cached <file>
Mais quelle est la différence?
Supposons que le fichier a été mis en scène et existe dans répertoire de travail aussi, l'utilisation git rm --cached <file>
si vous voulez le supprimer de répertoire mise en scène , et conserver le fichier répertoire de travail . Mais remarquez que cette opération ne sera pas seulement supprimer le fichier de Répertoire mise en scène , mais aussi marquer le fichier comme deleted
Répertoire mise en scène , si vous utilisez
git status
après cette opération, vous verrez ceci:
deleted: <file>
Il est un enregistrement de la suppression du fichier de Répertoire mise en scène . Si vous ne souhaitez pas conserver cet enregistrement et juste voulez simplement annuler une opération précédente étape d'un fichier, utilisez git reset HEAD <file>
à la place.
-------- -------- FIN DE RÉPONSE
PS: Je l'ai remarqué quelques réponses mentionnées:
git checkout -- <file>
Cette commande est la situation lorsque le fichier a été mis en scène , mais le fichier a été modifié dans le répertoire de travail après avoir été mis en scène, utilisez cette opération pour restaurer la fichier répertoire de travail répertoire mise en scène . En d'autres termes, après cette opération, les changements se produisent dans votre répertoire de travail , PAS Répertoire mise en scène .
Vous devez être dans le répertoire du fichier et puis tapez la commande suivante dans le terminal
git reset HEAD .
Assomption est que vous devez réinitialiser un seul fichier.
Pour désindexer tout à la fois, exécutez cette commande
git reset HEAD -- .
git checkout -- <file>
Il fonctionne parfaitement pour supprimer les fichiers de la zone de transit
Dans mon cas, je fais
git checkout -- FILE