web-dev-qa-db-fra.com

"git rm --cached x" vs "git réinitialiser la tête - x"?

GitRef.org - Basic :

git rm supprimera les entrées de la zone de stockage intermédiaire. Ceci est un peu différent de git 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 utiliser git rm --cached.

Mais quelle est exactement la différence entre git rm --cached asd et git reset head -- asd?

140
Pacerier

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: :
- soft

Ne 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 fileDans 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é.

199
manojlds

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.

71
Greg Hewgill

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.

37
yuriks