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?
git
version-control
staging
PHLAK
la source
la source
Réponses:
Si je comprends bien la question, vous voulez simplement "annuler" ce
git add
qui 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 status
le fichier apparaîtra à nouveau comme modifié mais pas encore mis en scène.Voir la
git reset
page de manuel pour plus de détails.la source
git rm --cached FILE
comme suggéré par une autre réponse.,
la source
git reset
ici, je pense, car vous pouvez annuler l'option --chached et devenir triste rapidement en utilisant lagit rm
commande :-) Avecgit reset
vous ê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 parlegit reset --hard
).git rm --cached FILE
supprime le fichier sans supprimer le fichier de l'arborescence de travail. Ceci est différent de la question, qui portait sur l'annulationgit add
.git rm --cached
entraî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/…git reset <file>
Fonctionne, que vous ayez ou non effectué des validations précédentes.
la source
Donc, un léger ajustement à la réponse de Tim Henigan: vous devez utiliser - avant le nom du fichier. Cela ressemblerait à ceci:
la source
--
et pourquoi l'ajouter? Je l'ai faitgit reset HEAD <file>
et cela a fonctionné.--
est une sorte de diviseur. Dans le cas où le nom de fichier n'est pas conventionnel, par exemple (-f
oumaster
) git l'interpréterait comme argument de ligne de commande ou nom de branche au lieu de nom de fichier. Voir iciSi 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.
la source
Si vous souhaitez simplement supprimer un sous-ensemble des modifications apportées à votre fichier, vous pouvez utiliser:
ou
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.la source
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 .
la source
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
ou
la source
Lorsque vous le faites
git status
, Git vous explique comment décompresser:Cela
git reset HEAD <file>
a donc fonctionné pour moi et les changements n'ont pas été modifiés.la source
Je pense que vous avez probablement été confondu avec le concept d' index , comme l'a commenté @CB Bailey:
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:
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:
et
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 commedeleted
dans le répertoire intermédiaire , si vous utilisezaprès cette opération, vous verrez ceci:
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 .
la source
Après la version
2.23
, Git a introduit lagit restore
commande que vous pouvez utiliser pour cela. Citant la documentation officielle: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.la source
Il existe pour les nouvelles versions de Git
git restore --staged <file>
.Quand je fais une
git status
version avec Git,2.26.2.windows.1
il est également recommandé de désinstaller:( 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 restore
ainsigit reset
que des paramètres supplémentaires pourgit restore
.la source
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
pour les déchaîner.
la source
Mon échantillon:
Comme vous pouvez le remarquer
la source
Vous devez être dans le répertoire du fichier, puis taper ce qui suit dans le terminal
L'hypothèse est que vous devez réinitialiser un seul fichier.
la source
Pour tout décompresser d'un seul coup, exécutez cette commande
la source
git checkout -- <file>
Il fonctionne parfaitement pour supprimer des fichiers de la zone de transit
la source
Dans mon cas, je fais
la source