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 file
você 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 --mixed
e 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 rm
por 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 --cached
no 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 --cached
ogit diff
comando não mostra nenhum diff, masgit diff --cached
mostra o diff, como se ainda estivesse em cache. Nogit status
entanto, mostra o arquivo como sendoUntracked
. Parece meio inconsistente.