git rm
supprimera les entrées de la zone de stockage intermédiaire. Ceci est un peu différent degit reset HEAD
qui "décompresse" les fichiers. Par "unstage", je veux dire que cela rétablit la zone de préparation comme avant la modification.git rm
, d'autre part, élimine complètement le fichier, de sorte qu'il ne soit pas inclus dans l'instantané de validation suivant, ce qui le supprime effectivement.Par défaut, un
git rm file
supprimera entièrement le fichier de la zone de stockage intermédiaire et de votre disque> (le répertoire de travail). Pour laisser le fichier dans le répertoire de travail, vous pouvez utilisergit rm --cached
.
Mais quelle est exactement la différence entre git rm --cached asd
et git reset head -- asd
?
Un fichier, par exemple, peut se trouver à trois endroits: l’arborescence, l’index et la copie de travail. Lorsque vous ajoutez un fichier à un dossier, vous l’ajoutez à la copie de travail.
Quand vous faites quelque chose comme git add file
vous l'ajoutez à l'index. Et lorsque vous le commettez, vous l'ajoutez également à l'arbre.
Cela vous aidera probablement à connaître les trois drapeaux les plus communs dans la réinitialisation de git:
réinitialisation de git [--
<mode>
] [<commit>
]Ce formulaire réinitialise la tête de la branche actuelle sur
<commit>
et éventuellement met à jour l’index (en le réinitialisant dans l’arborescence de<commit>
) et l’arbre de travail en fonction de<mode>
, qui doit être l’un des éléments suivants: :
- softNe touche pas du tout le fichier d'index ni l'arbre de travail (mais réinitialise la tête sur
<commit>
, comme le font tous les modes). Cela laisse tous vos fichiers modifiés "Les modifications à valider", comme le dirait le statut de git.- mixte
Réinitialise l’index mais pas l’arbre de travail (c’est-à-dire que les fichiers modifiés sont conservés mais ne sont pas marqués pour la validation) et rapporte ce qui n’a pas été mis à jour. C'est l'action par défaut.
- difficile
Réinitialise l'index et l'arbre de travail. Toutes les modifications apportées aux fichiers suivis dans l’arbre de travail depuis
<commit>
sont ignorées.
Maintenant, lorsque vous faites quelque chose comme git reset HEAD
, vous faites réellement git reset HEAD --mixed
et il "réinitialisera" l'index dans l'état où il se trouvait avant l'ajout de fichiers/l'ajout de modifications (via git add
) Dans ce cas, la copie de travail et l'index (ou le stockage intermédiaire) étaient synchronisés, mais vous avez synchronisé le HEAD et l'index après la réinitialisation.
git rm
supprime par contre un fichier du répertoire de travail et de l'index et, lorsque vous validez, le fichier est également supprimé de l'arborescence. git rm --cached
supprime toutefois le fichier de l'index seul et le conserve dans votre copie de travail. C’est l’opposé exact de git add file
Dans ce cas, vous avez modifié l’index par rapport à HEAD et le travail dans lequel le HEAD a la version précédemment validée du fichier, la copie de travail, avait la dernière modification, le cas échéant, ou le contenu du fichier HEAD et vous supprimiez le fichier de l'index. Un commit maintenant synchronisera l'index, l'arborescence et le fichier. sera supprimé.
Peut-être qu'un exemple aidera:
git rm --cached asd
git commit -m "the file asd is gone from the repository"
versus
git reset HEAD -- asd
git commit -m "the file asd remains in the repository"
Notez que si vous n'avez rien changé else, le second commit ne fera rien.
git rm --cached file
va supprimer le fichier de la scène. C'est-à-dire que lorsque vous validez, le fichier sera supprimé. git reset HEAD -- file
réinitialisera simplement le fichier dans la zone de stockage intermédiaire à l'état où il se trouvait sur le commit HEAD, c'est-à-dire qu'il annulera toutes les modifications apportées depuis la dernière validation. Si ce changement consiste à ajouter le fichier récemment, ils seront équivalents.