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.git reset --mixed
. Fiquei um pouco confuso com a afirmação quegit rm --cached
é o oposto degit add
. Tomada literalmente, está incorreta e pode causar danos. No meu caso, eu costumavagit add
adicionar um arquivo modificado à área de teste e queria o oposto de "that add" e não a adição inicial do arquivo. + A resposta de Greg Hewgill me ajudou a obter uma imagem mais clara.git rm --cached
'é exatamente o oposto degit add file
' é enganoso.git reset file
está mais perto de ser o oposto degit add file
.Talvez um exemplo ajude:
versus
Observe que, se você não alterou mais nada , o segundo commit não fará nada.
fonte
--
É usado para separar as opções de comando dos nomes dos arquivos. Se houvesse uma ramificação e um arquivo nomeadosasd
,git reset HEAD asd
seria ambíguo. O--
diz "tudo seguindo este é um nome de arquivo".git reset HEAD <file>
exatamente o mesmo quegit rm --cached <file>
e entãogit add --intent-to-add <file>
?git rm --cached file
irá remover o arquivo do palco. Ou seja, quando você confirmar o arquivo será removido.git reset HEAD -- file
simplesmente redefinirá o arquivo na área de teste para o estado em que estava no commit HEAD, ou seja, desfará todas as alterações feitas nele desde o último commit. Se essa alteração estiver adicionando o arquivo recentemente, elas serão equivalentes.fonte
git rm --cached file
é meio opostagit add
, essa resposta fez muito sentido para mim e foi bem sucinta. Quase tão curto quanto esse comentário;)git rm --cached file
não é o oposto degit add file
. O comportamento passa a ser o opostogit add file
no caso específico em que você adicionou um novo arquivo anteriormente não rastreado. Em qualquer outro caso, o oposto degit add file
égit reset HEAD file
.git reset HEAD file
também revertegit add file
no primeiro caso (adicionando um arquivo não rastreado) e, em todos os casos, é por isso que o git sugere fazer se você deseja reverter um add do git.