Situação: Eu tenho um repositório Git com arquivos já no índice. Eu faço alterações em vários arquivos, abro o Git e adiciono esses arquivos à minha área de preparação com "git add".
Pergunta: Como removo um desses arquivos da área de preparação, mas não o removo do índice ou desfiz as alterações no próprio arquivo?
git
version-control
staging
PHLAK
fonte
fonte
Respostas:
Se entendi a pergunta corretamente, você simplesmente deseja "desfazer" o
git add
que foi feito para esse arquivo.Se você precisar remover um único arquivo da área de preparação, use
git reset HEAD -- <file>
Se você precisar remover um diretório (pasta) inteiro da área de preparação, use
git reset HEAD -- <directoryName>
Suas modificações serão mantidas. Quando você executa
git status
o arquivo, mais uma vez será exibido como modificado, mas ainda não preparado.Veja a
git reset
página de manual para detalhes.fonte
git rm --cached FILE
sugerido por outra resposta.,
fonte
git reset
aqui, eu acho, pois você pode omitir a opção --chached e ficar triste rapidamente usando ogit rm
comando :-) Comgit reset
o seu lado seguro, se você esquecer de adicionar "alguma opção", mantenha a alteração para que seja "mais seguro" para uso diário (estou falando sobregit reset --hard
).git rm --cached FILE
encena a exclusão do arquivo, sem excluir o arquivo da árvore de trabalho. Isso é diferente da questão, que era sobre desfazergit add
.git rm --cached
fará com que o arquivo seja removido do índice, ou seja, o arquivo se tornará um arquivo não rastreado . Eu não acho que isso é o que o OP quer. Consulte um fio relacionada aqui: stackoverflow.com/questions/45047810/...git reset <file>
Funciona se você possui ou não confirmações anteriores.
fonte
Portanto, um pequeno ajuste na resposta de Tim Henigan: você precisa usar - antes do nome do arquivo. Seria assim:
fonte
--
faz e por que adicioná-lo? Eu fizgit reset HEAD <file>
e funcionou.--
é uma espécie de divisor. Caso o nome do arquivo não seja convencional, por exemplo, o (-f
oumaster
) git o interpretaria como argumento da linha de comando ou nome da ramificação, em vez do nome do arquivo. Veja aquiSe você tiver uma modificação no nome do arquivo.txt, você a adicionou por etapas por engano e deseja remover o arquivo da preparação, mas não deseja perder as alterações.
fonte
Caso você queira apenas remover um subconjunto das alterações no seu arquivo, você pode usar:
ou
Este comando é basicamente o inverso de
git add -p
: ele removerá apenas as alterações selecionadas da área de preparação. Acho extremamente útil "não adicionar" algo que adicionei por engano.fonte
Se você deseja remover arquivos seguindo um determinado padrão e estiver usando
git rm --cached
, também pode usar padrões de globos de arquivos.Veja aqui .
fonte
Você quer:
Afetar um único arquivo
Remover arquivo da área de preparação
Não remover arquivo único do índice
Não desfaça a mudança em si
e a solução é
ou
fonte
Quando você faz isso
git status
, o Git mostra como desestabilizar:Então
git reset HEAD <file>
funcionou para mim e as mudanças não foram tocadas.fonte
Acho que você provavelmente se confundiu com o conceito de índice , como comentou @CB Bailey:
Você pode simplesmente considerar o diretório e o índice de preparação como a mesma coisa.
Então, assim como a resposta de Tim Henigan , eu acho:
Aqui está a minha resposta:
Geralmente, existem duas maneiras de desfazer uma operação de estágio , como outras respostas já mencionadas:
e
Mas qual é a diferença?
Suponha que o arquivo tenha sido preparado e exista também no diretório ativo, use
git rm --cached <file>
se você deseja removê-lo do diretório intermediário e mantenha o arquivo no diretório ativo . Mas observe que esta operação não apenas removerá o arquivo do diretório temporário, mas também marcará o arquivo comodeleted
no diretório temporário , se você usarApós esta operação, você verá o seguinte:
É um registro de remoção do arquivo do diretório intermediário . Se você não deseja manter esse registro e simplesmente deseja desfazer uma operação de estágio anterior de um arquivo, use-o
git reset HEAD <file>
.-------- FIM DA RESPOSTA --------
PS: Eu notei algumas respostas mencionadas:
git checkout -- <file>
Este comando é para a situação em que o arquivo foi preparado , mas o arquivo foi modificado no diretório de trabalho após ser preparado, use esta operação para restaurar o arquivo no diretório de trabalho a partir do diretório de preparação . Em outras palavras, após esta operação, as alterações acontecem no diretório ativo, NÃO no diretório intermediário .
fonte
Após a versão
2.23
, o Git introduziu ogit restore
comando que você pode usar para fazer isso. Citando a documentação oficial:Assim, você pode invocar
git restore --staged <path>
e desestabilizar o arquivo, mas também manter as alterações feitas. Lembre-se de que, se o arquivo não foi preparado, você perde todas as alterações feitas nele.fonte
Se você fizer alterações em muitos arquivos rastreados, mas quiser apenas exibir alguns deles, faça uma
git add .
nem sempre é favorável (ou recomendado) - pois encena todos os arquivos rastreados (alguns casos em que você deseja manter as alterações apenas para si mesmo e não deseja encaminhá-las para o repositório remoto).
nem é ideal fazer um monte de
git add path/to/file1 path/to/file2
se você tiver muitos diretórios aninhados (o que é o caso na maioria dos projetos) - fica irritante
É quando o Git GUI é útil (provavelmente apenas o tempo em que eu o uso). Basta abrir a GUI do Git, ela mostra seções de arquivo em etapas e em etapas. Selecione os arquivos da seção faseada que você deseja desfazer e pressione
desestabilizá-los.
fonte
Para versões mais recentes do Git existe
git restore --staged <file>
.Quando eu faço uma
git status
versão com o Git2.26.2.windows.1
, também é recomendado para desestágio:( Este post mostra que, nas versões anteriores,
git reset HEAD
era recomendado neste momento)Posso altamente recomendar este post explicando as diferenças entre
git revert
,git restore
egit reset
e também parâmetros adicionais paragit restore
.fonte
Minha amostra:
Como você pode notar
fonte
Você precisa estar no diretório do arquivo e digite o seguinte no terminal
Suposição é que você precisa redefinir apenas um arquivo.
fonte
Para desfazer tudo de uma vez, execute este comando
fonte
git checkout -- <file>
Funciona perfeitamente para remover arquivos da área de armazenamento temporário
fonte
No meu caso, eu faço
fonte