Existem três lugares onde um arquivo, digamos, pode estar - a árvore, o índice e a cópia de trabalho. Ao adicionar um arquivo a uma pasta, você o adiciona à cópia de trabalho.
Quando você faz algo como git add filevocê o adiciona ao índice. E quando você o confirma, você o adiciona à árvore também.
Provavelmente, ajudará você a conhecer os três sinalizadores mais comuns no git reset:
git reset [- <mode>] [ <commit>]
Este formulário redefine o cabeçalho de ramificação atual para <commit>e possivelmente atualiza o índice (redefinindo-o para a árvore de <commit>) e a árvore de trabalho, dependendo da <mode>que deve ser uma das seguintes opções :
--soft
Não toca no arquivo de índice nem na árvore de trabalho (mas redefine o cabeçalho para <commit>, como todos os modos). Isso deixa todos os seus arquivos alterados "Alterações a serem confirmadas", como o status do git colocaria.
--misturado
Redefine o índice, mas não a árvore de trabalho (ou seja, os arquivos alterados são preservados, mas não marcados para confirmação) e relata o que não foi atualizado. Esta é a ação padrão.
--Difícil
Redefine o índice e a árvore de trabalho. Quaisquer alterações nos arquivos rastreados na árvore de trabalho desde então <commit>são descartadas.
Agora, quando você faz algo como git reset HEAD- o que você está realmente fazendo é git reset HEAD --mixede ele "redefinirá" o índice para o estado em que estava antes de começar a adicionar arquivos / adicionar modificações ao índice (via git add) Nesse caso, a cópia de trabalho e o O índice (ou teste) estava sincronizado, mas você fez com que o HEAD e o índice estivessem sincronizados após a redefinição.
git rmpor outro lado, remove um arquivo do diretório ativo e do índice e, quando você confirma, o arquivo também é removido da árvore. git rm --cachedno entanto, remove o arquivo do índice sozinho e o mantém em sua cópia de trabalho. Esse é exatamente o oposto de git add file Neste caso, você transformou o índice em diferente do HEAD e do trabalho, pois o HEAD possui a versão do arquivo confirmada anteriormente, a cópia de trabalho teve a última modificação, se houver, ou o conteúdo de HEAD de o arquivo e você removeu o arquivo do índice. Uma confirmação agora sincronizará o índice e a árvore e o arquivo será removido.
git rm --cachedogit diffcomando não mostra nenhum diff, masgit diff --cachedmostra o diff, como se ainda estivesse em cache. Nogit statusentanto, mostra o arquivo como sendoUntracked. Parece meio inconsistente.