Esistono tre posizioni in cui un file, per esempio, può essere: l'albero, l'indice e la copia di lavoro. Quando aggiungi un file a una cartella, lo stai aggiungendo alla copia di lavoro.
Quando fai qualcosa di simile git add file
lo aggiungi all'indice. E quando lo commetti, lo aggiungi anche all'albero.
Probabilmente ti aiuterà a conoscere i tre flag più comuni in git reset:
git reset [- <mode>
] [ <commit>
]
Questo modulo reimposta la testa del ramo corrente <commit>
e probabilmente aggiorna l'indice (ripristinandolo all'albero di <commit>
) e l'albero di lavoro a seconda <mode>
, che deve essere uno dei seguenti:
--soft
Non tocca affatto il file indice né l'albero di lavoro (ma reimposta la testa <commit>
, proprio come fanno tutte le modalità). Questo lascia tutti i tuoi file modificati "modifiche da impegnare", come direbbe lo stato git.
--misto
Reimposta l'indice ma non l'albero di lavoro (ovvero, i file modificati vengono conservati ma non contrassegnati per il commit) e riporta ciò che non è stato aggiornato. Questa è l'azione predefinita.
--difficile
Reimposta l'indice e l'albero di lavoro. Qualsiasi modifica ai file tracciati nella struttura di lavoro <commit>
viene scartata.
Ora, quando fai qualcosa del genere git reset HEAD
, ciò che stai effettivamente facendo è git reset HEAD --mixed
e "ripristinerà" l'indice allo stato in cui si trovava prima di iniziare ad aggiungere file / aggiungere modifiche all'indice (tramite git add
) In questo caso, la copia di lavoro e il L'indice (o la stadiazione) erano sincronizzati, ma dopo la reimpostazione sono stati sincronizzati HEAD e l'indice.
git rm
d'altra parte rimuove un file dalla directory di lavoro e dall'indice e quando si esegue il commit, il file viene rimosso anche dall'albero. git rm --cached
tuttavia rimuove il file dall'indice da solo e lo mantiene nella copia di lavoro. Questo è esattamente l'opposto di git add file
In questo caso, hai reso l'indice diverso da HEAD e funzionante, in quanto HEAD ha la versione del file precedentemente impegnata, la copia funzionante ha avuto l'ultima modifica se presente o il contenuto di HEAD di il file e il file è stato rimosso dall'indice. Un commit ora sincronizzerà l'indice e l'albero e il file verrà rimosso.
git rm --cached
ilgit diff
comando non mostra alcun diff, magit diff --cached
mostra il diff, come se fosse ancora memorizzato nella cache. Ilgit status
tuttavia mostra il file comeUntracked
. Sembra incoerente.