Comment supprimer un seul fichier de la zone de transfert (annuler l'ajout de git)?

1233

Situation: j'ai un dépôt Git avec des fichiers déjà dans l'index. J'apporte des modifications à plusieurs fichiers, j'ouvre Git et j'ajoute ces fichiers à ma zone de transit avec "git add".

Question: Comment puis-je supprimer l'un de ces fichiers de la zone de transfert sans le supprimer de l'index ou annuler les modifications apportées au fichier lui-même?

PHLAK
la source
40
La zone de rassemblement est l'index, alors peut-être pourriez-vous clarifier exactement ce que vous voulez dire?
CB Bailey

Réponses:

1903

Si je comprends bien la question, vous voulez simplement "annuler" ce git addqui a été fait pour ce fichier.

Si vous devez supprimer un seul fichier de la zone de transit, utilisez

git reset HEAD -- <file>

Si vous devez supprimer un répertoire (dossier) entier de la zone de transit, utilisez

git reset HEAD -- <directoryName>

Vos modifications seront conservées. Lorsque vous exécutez git statusle fichier apparaîtra à nouveau comme modifié mais pas encore mis en scène.

Voir la git resetpage de manuel pour plus de détails.

Tim Henigan
la source
41
Merci ... Je viens de remarquer que cela est indiqué juste au-dessus des fichiers intermédiaires. Je suppose que je regarde cet écran depuis si longtemps que je choisissais sélectivement ce que je voulais voir.
PHLAK
2
Cela met en scène tous mes changements, contrairement à tous les conseils que j'ai reçus n'importe où (pages de manuel, ici, amis, etc.). Je continue de penser un jour que ça va faire ce qui est annoncé, mais non.
rektide
6
Existe-t-il de toute façon de supprimer des fichiers de la mise en scène lorsqu'il n'y a eu aucun commit sur le dépôt?
Jared Forsyth
3
Je reviens et reviens à cette question. Pourquoi ne puis-je pas voter plus souvent? :)
Puce
3
@Jared Forsyth Pour supprimer un fichier jamais validé de la scène, utilisez la commande git rm --cached FILEcomme suggéré par une autre réponse.
chmike
151
git rm --cached FILE

,

git rm -r --cached CVS */CVS
user335425
la source
28
vrai, mais il vaut mieux l'utiliser git resetici, je pense, car vous pouvez annuler l'option --chached et devenir triste rapidement en utilisant la git rmcommande :-) Avec git resetvous êtes du bon côté, si vous oubliez d'ajouter "une option" ça va garder le changement pour qu'il soit "plus sûr" pour une utilisation quotidienne (je parle git reset --hard).
Konrad 'ktoso' Malawski
20
Cette méthode est utile si vous n'avez pas de validations précédentes.
SomeKittens
2
git rm --cached FILEsupprime le fichier sans supprimer le fichier de l'arborescence de travail. Ceci est différent de la question, qui portait sur l'annulation git add.
Sampo Smolander
1
Cette réponse génère une erreur si vous avez supprimé le fichier de l'arborescence de travail.
Samuel Robert
3
git rm --cachedentraînera la suppression du fichier de l'index, c'est-à-dire que le fichier deviendra un fichier non suivi . Je ne pense pas que c'est ce que souhaite OP. Veuillez consulter un fil connexe ici: stackoverflow.com/questions/45047810/…
smwikipedia
89

git reset <file>

Fonctionne, que vous ayez ou non effectué des validations précédentes.

MTS
la source
53

Donc, un léger ajustement à la réponse de Tim Henigan: vous devez utiliser - avant le nom du fichier. Cela ressemblerait à ceci:

git reset HEAD -- <file>
GuerillaNerd
la source
6
Que fait le --et pourquoi l'ajouter? Je l'ai fait git reset HEAD <file>et cela a fonctionné.
Paolo
15
--est une sorte de diviseur. Dans le cas où le nom de fichier n'est pas conventionnel, par exemple ( -fou master) git l'interpréterait comme argument de ligne de commande ou nom de branche au lieu de nom de fichier. Voir ici
Andrew
3
Cela a fonctionné pour moi où la commande sans - n'était pas due à l'absence de validations précédentes pour ce fichier. Merci.
Matt
18
git reset filename.txt

Si vous avez une modification dans filename.txt, vous l'avez ajoutée à l'étape par erreur et vous voulez supprimer le fichier de la mise en scène mais vous ne voulez pas perdre les modifications.

Vlad Cioaba
la source
6

Si vous souhaitez simplement 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 fondamentalement l'inverse de git add -p: elle supprimera uniquement les modifications sélectionnées de la zone de transfert. Je trouve cela extrêmement utile pour "ajouter" quelque chose que j'ai ajouté par erreur.

fede1024
la source
4

Si vous souhaitez supprimer des fichiers suivant un certain modèle et que vous utilisez git rm --cached, vous pouvez également utiliser des modèles de glob de fichier.

Voyez ici .

thilinarmtb
la source
2

Tu veux:

  • Affecter à un seul fichier

  • Supprimer le fichier de la zone de transit

  • Ne pas supprimer un seul fichier de l'index

  • N'annulez pas 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
Do Nhu Vy
la source
2

Lorsque vous le faites git status, Git vous explique comment décompresser:

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

Cela git reset HEAD <file>a donc fonctionné pour moi et les changements n'ont pas été modifiés.


la source
2

Je pense que vous avez probablement été confondu avec le concept d' index , comme l'a commenté @CB Bailey:

La zone de transit est l'index.

Vous pouvez simplement considérer le répertoire et l' indexation intermédiaires comme la même chose.
Donc, tout comme la réponse de @Tim Henigan , je suppose:

vous voulez simplement "annuler" ce git addqui a été fait pour ce fichier.



Voici ma réponse:

Généralement, il existe deux façons d'annuler une opération par étapes , 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é transféré et existe également dans le répertoire de travail , utilisez-le git rm --cached <file>si vous souhaitez le supprimer du répertoire de stockage et conservez le fichier dans le répertoire de travail . Mais notez que cette opération supprimera non seulement le fichier du répertoire intermédiaire, mais marquera également le fichier comme deleteddans le répertoire intermédiaire , si vous utilisez

git status

après cette opération, vous verrez ceci:

        deleted:    <file>

C'est un enregistrement de la suppression du fichier du répertoire intermédiaire . Si vous ne souhaitez pas conserver cet enregistrement et souhaitez simplement annuler une opération d'un fichier à l'étape précédente, utilisez git reset HEAD <file>plutôt.


-------- FIN DE RÉPONSE --------

PS: J'ai remarqué certaines réponses mentionnées:

git checkout -- <file>

Cette commande est destinée au cas où le fichier a été transféré , mais le fichier a été modifié dans le répertoire de travail après avoir été transféré, utilisez cette opération pour restaurer le fichier dans le répertoire de travail à partir du répertoire de transfert . En d'autres termes, après cette opération, des changements se produisent dans votre répertoire de travail , PAS dans votre répertoire intermédiaire .

Wulfric Lee
la source
2

Après la version 2.23, Git a introduit la git restorecommande que vous pouvez utiliser pour cela. Citant la documentation officielle:

Restaurez les chemins d'accès spécifiés dans l'arborescence de travail avec du contenu provenant d'une source de restauration. Si un chemin est suivi mais n'existe pas dans la source de restauration, il sera supprimé pour correspondre à la source.

La commande peut également être utilisée pour restaurer le contenu de l'index avec --stagedou restaurer à la fois l'arborescence de travail et l'index avec --staged --worktree.

Vous pouvez donc invoquer git restore --staged <path>et supprimer le fichier, mais également conserver les modifications que vous avez apportées. N'oubliez pas que si le fichier n'a pas été mis en scène, vous perdez toutes les modifications que vous y avez apportées.

Mike
la source
2

Il existe pour les nouvelles versions de Git git restore --staged <file>.

Quand je fais une git statusversion avec Git, 2.26.2.windows.1il est également recommandé de désinstaller:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

( Ce message montre que, dans les versions antérieures, il git reset HEADétait recommandé à ce stade)

Je peux fortement recommander cet article expliquant les différences entre git revert, git restoreainsi git resetque des paramètres supplémentaires pour git restore.

Ruik
la source
1

Si vous apportez des modifications à de nombreux fichiers suivis mais que vous souhaitez n'en mettre en scène que quelques-uns,

git add .

n'est pas toujours favorable (ou recommandé) - car il met en scène tous les fichiers suivis (certains cas où vous souhaitez conserver les modifications uniquement pour vous-même et ne pas les transférer dans le référentiel distant).

il n'est pas non plus idéal de faire un tas de

git add path/to/file1 path/to/file2

si vous avez beaucoup de répertoires imbriqués (ce qui est le cas dans la plupart des projets) - devient ennuyeux

C'est à ce moment que Git GUI est utile (probablement seulement une fois que je l'utilise). Ouvrez simplement Git GUI, il affiche les sections de fichiers intermédiaires et non intermédiaires. Sélectionnez les fichiers de la section intermédiaire que vous souhaitez décompresser et appuyez sur

Ctrl+U (Pour les fenêtres)

pour les déchaîner.

rite2hhh
la source
0

Mon échantillon:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

Comme vous pouvez le remarquer

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)
Khang Azun
la source
-1

Vous devez être dans le répertoire du fichier, puis taper ce qui suit dans le terminal

git reset HEAD .

L'hypothèse est que vous devez réinitialiser un seul fichier.

nevosial
la source
-4

Pour tout décompresser d'un seul coup, exécutez cette commande

git reset HEAD -- .
Devendra Verma
la source
Impossible d'ajouter des fichiers après cela.
Karl Morrison
-10

git checkout -- <file>

Il fonctionne parfaitement pour supprimer des fichiers de la zone de transit

Juan Ramirez
la source
4
comme indiqué ci-dessous, cela annule les modifications apportées au fichier, ce qui va plus loin que OP ne le souhaite.
stolli
git rm flie.txt --cached
Juan Ramirez
-11

Dans mon cas, je fais

git checkout -- FILE
Maxi Capodacqua
la source
9
Cela annulerait les modifications apportées au fichier, n'est-ce pas?
Martin Burch