Comment puis-je supprimer un seul fichier de la zone de mise en scène (undo git add)?

StackOverflow https://stackoverflow.com/questions/1505948

  •  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

Était-ce utile?

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
scroll top