Comment supprimer un seul fichier de la zone de transfert de Git mais ne pas le supprimer de l'index ou annuler les modifications apportées au fichier lui-même?
Situation: j'ai un dépôt Git avec des fichiers déjà dans l'index. J'apporte des modifications à plusieurs fichiers, ouvre Git et ajoute ces fichiers à ma zone de transit avec " git add ."
Question: Comment puis-je supprimer un de ces fichiers de la zone de transfert mais ne pas le supprimer de l'index ou annuler les modifications apportées au fichier lui-même?
14 réponses
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 fichier unique de la zone intermédiaire, utilisez
git reset HEAD -- <file>
Si vous devez supprimer un répertoire entier (dossier) de la zone intermédiaire, utilisez
git reset HEAD -- <directoryName>
Vos modifications seront conservées. Lorsque vous exécutez git status
, le fichier apparaîtra à nouveau comme modifié mais pas encore mis en scène.
Voir le git reset
homme page pour plus de détails.
git reset <file>
Fonctionne que vous ayez ou non des commits précédents.
Donc, un léger tweak à la réponse de Tim Henigan: vous devez utiliser -- avant le nom du fichier. Cela ressemblerait à ceci:
git reset HEAD -- <file>
git reset filename.txt
Si vous avez une modification dans filename.txt, vous l'avez ajouté à stage par erreur et vous voulez supprimer le fichier de staging mais vous ne voulez pas perdre les modifications.
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 ne supprimera que les modifications sélectionnées de la zone de transit. Je le trouve extrêmement utile dans "unadding" quelque chose que j'ai ajouté par erreur.
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 file-glob.
Voir ici.
Vous voulez:
Affecter à un seul fichier
-
Supprimer le fichier de la zone intermédiaire
-
Ne pas supprimer un seul fichier de l'index
-
Ne pas annuler la modification elle-même
Et la solution est
git reset HEAD file_name.ext
Ou
git reset HEAD path/to/file/file_name.ext
Si vous apportez des modifications à de nombreux fichiers suivis mais que vous voulez seulement en mettre en scène quelques-uns, faites un
git add .
N'est pas toujours favorable (ou recommandé) - car il met en scène tous les fichiers suivis (certains cas où vous voulez conserver les modifications uniquement pour vous-même et ne voulez pas les mettre en scène 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) - obtient ennuyeux
C'est quand git GUI est utile (probablement seulement le temps que je l'utilise). Il suffit d'ouvrir Git GUI, il montre les sections de fichiers mises en scène et non stockées. Sélectionnez les fichiers de la section Mise en scène que vous souhaitez défaire et appuyez sur
Ctrl+U
(pour windows)
Pour les détacher.
Vous devez être dans le répertoire du fichier, puis tapez la commande suivante dans le terminal
git reset HEAD .
L'hypothèse est que vous devez réinitialiser un seul fichier.
Pour tout annuler à la fois, exécutez cette commande
git reset HEAD -- .
git checkout -- <file>
Cela fonctionne parfaitement pour supprimer des fichiers de la zone de transit