Il y a trois endroits où un fichier, par exemple, peut être - l'arborescence, l'index et la copie de travail. Lorsque vous ajoutez simplement un fichier à un dossier, vous l'ajoutez à la copie de travail.
Lorsque vous faites quelque chose comme git add file
vous l'ajoutez à l'index. Et lorsque vous le validez, vous l'ajoutez également à l'arbre.
Cela vous aidera probablement à connaître les trois indicateurs les plus courants dans git reset:
git reset [- <mode>
] [ <commit>
]
Ce formulaire réinitialise la tête de branche actuelle <commit>
et met éventuellement à 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 suivants:
--soft
Ne touche pas du tout le fichier d'index ni l'arborescence de travail (mais réinitialise la tête sur <commit>
, comme tous les modes le font). Cela laisse tous vos fichiers modifiés "Modifications à valider", comme le dirait l'état git.
--mixte
Réinitialise l'index mais pas l'arborescence de travail (c'est-à-dire que les fichiers modifiés sont conservés mais pas marqués pour la validation) et signale ce qui n'a pas été mis à jour. C'est l'action par défaut.
--dur
Réinitialise l'index et l'arborescence de travail. Toutes les modifications apportées aux fichiers suivis dans l'arborescence de travail depuis <commit>
sont ignorées.
Maintenant, quand vous faites quelque chose comme git reset HEAD
- ce que vous faites réellement est git reset HEAD --mixed
et cela "réinitialise" l'index à l'état où il était avant de commencer à ajouter des fichiers / ajouter des modifications à l'index (via git add
) Dans ce cas, la copie de travail et le index (ou staging) étaient synchronisés, mais vous avez fait en sorte que HEAD et l'index soient synchronisés après la réinitialisation.
git rm
d'autre part, supprime 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
cependant supprime le fichier de l'index seul et le conserve dans votre copie de travail. C'est exactement le contraire de git add file
Dans ce cas, vous avez fait que l'index soit différent de la tête et du travail, en ce que la tête a la version précédemment validée du fichier, la copie de travail a eu la dernière modification, le cas échéant, ou le contenu de HEAD de le fichier et vous avez supprimé le fichier de l'index. Un commit maintenant synchronisera l'index et l'arborescence et le fichier sera supprimé.
git rm --cached
lagit diff
commande ne montre aucun diff, maisgit diff --cached
montre le diff, comme s'il était toujours en cache. Legit status
cependant montre le fichier comme étantUntracked
. Cela semble un peu incohérent.git reset --mixed
. J'étais un peu confus par la déclaration quigit rm --cached
est le contraire degit add
. Pris à la lettre, il est incorrect et pourrait causer des dommages. Dans mon cas, j'avais l'habitudegit add
d'ajouter un fichier modifié à la zone de transit et je voulais le contraire de "qui ajoute" et non l'ajout initial du fichier. + La réponse de Greg Hewgill m'a aidé à avoir une image plus claire.git rm --cached
«est exactement le contraire degit add file
» est trompeur.git reset file
est plus proche de l'opposé degit add file
.Peut-être qu'un exemple vous aidera:
contre
Notez que si vous n'avez rien changé d' autre , le deuxième commit ne fera rien.
la source
--
est utilisé pour séparer les options de commande des noms de fichiers. S'il y avait à la fois une branche et un fichier nommésasd
, alors cegit reset HEAD asd
serait ambigu. Le--
dit "tout ce qui suit est un nom de fichier".git reset HEAD <file>
exactement la même chose quegit rm --cached <file>
et alorsgit add --intent-to-add <file>
?git rm --cached file
va supprimer le fichier de la scène. Autrement dit, lorsque vous validez, le fichier sera supprimé.git reset HEAD -- file
réinitialisera simplement le fichier dans la zone de préparation à l'état où il était lors de la validation HEAD, c'est-à-dire annulera toutes les modifications que vous y avez apportées depuis la dernière validation. Si ce changement vient d'ajouter le fichier, alors ils seront équivalents.la source
git rm --cached file
est un peu le contraire degit add
, cette réponse avait beaucoup de sens pour moi et était assez succincte. Presque aussi court que ce commentaire;)git rm --cached file
n'est pas le contraire degit add file
. Le comportement se trouve être le contraire dugit add file
cas spécifique où vous avez ajouté un nouveau fichier, précédemment non suivi. Dans tous les autres cas, l'opposé degit add file
estgit reset HEAD file
.git reset HEAD file
inverse égalementgit add file
dans le premier cas (ajout d'un fichier non suivi), et dans tous les cas, c'est pourquoi c'est ce que git suggère de faire si vous voulez inverser un git add.