Como removo um único arquivo da área de preparação (desfazer git add)?

1231

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?

PHLAK
fonte
40
A área de preparação é o índice, então talvez você possa esclarecer exatamente o que quer dizer?
CB Bailey
Possível duplicata de Como desfazer 'git add' antes de confirmar?
TungstenX

Respostas:

1903

Se entendi a pergunta corretamente, você simplesmente deseja "desfazer" o git addque 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 statuso arquivo, mais uma vez será exibido como modificado, mas ainda não preparado.

Veja a git resetpágina de manual para detalhes.

Tim Henigan
fonte
41
Obrigado ... Acabei de perceber que isso é afirmado logo acima dos arquivos faseados. Acho que estou olhando para a tela há tanto tempo que estava escolhendo seletivamente o que queria ver.
PHLAK
2
Isso desestabiliza todas as minhas alterações, ao contrário de todos os conselhos que recebi em qualquer lugar (páginas de manual, aqui, amigos etc.). Eu fico pensando que algum dia ele fará o que é anunciado, mas não.
Re Junção
6
Existe alguma maneira de remover os arquivos da preparação quando não há nenhum commit no repositório?
Jared Forsyth
3
Eu continuo indo e vindo para esta pergunta. Por que não posso votar mais vezes? :)
Puce 23/09
3
@Jared Forsyth Para remover um arquivo nunca confirmado do palco, use o comando git rm --cached FILEsugerido por outra resposta.
chmike
151
git rm --cached FILE

,

git rm -r --cached CVS */CVS
user335425
fonte
28
verdade, mas é melhor usar git resetaqui, eu acho, pois você pode omitir a opção --chached e ficar triste rapidamente usando o git rmcomando :-) Com git reseto 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 sobre git reset --hard).
Konrad 'ktoso' Malawski 06/03/11
20
Este método é útil se você não tiver confirmações anteriores.
SomeKittens
2
git rm --cached FILEencena a exclusão do arquivo, sem excluir o arquivo da árvore de trabalho. Isso é diferente da questão, que era sobre desfazer git add.
Sampo Smolander
1
Esta resposta gera um erro se você excluiu o arquivo da árvore de trabalho.
Samuel Robert
3
git rm --cachedfará 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/...
smwikipedia
88

git reset <file>

Funciona se você possui ou não confirmações anteriores.

MTS
fonte
53

Portanto, um pequeno ajuste na resposta de Tim Henigan: você precisa usar - antes do nome do arquivo. Seria assim:

git reset HEAD -- <file>
GuerillaNerd
fonte
6
O que --faz e por que adicioná-lo? Eu fiz git reset HEAD <file>e funcionou.
Paolo
15
--é uma espécie de divisor. Caso o nome do arquivo não seja convencional, por exemplo, o ( -fou master) git o interpretaria como argumento da linha de comando ou nome da ramificação, em vez do nome do arquivo. Veja aqui
Andrew
3
Isso funcionou para mim onde o comando sem - não ocorreu por não haver confirmações anteriores para esse arquivo. Obrigado.
Matt
17
git reset filename.txt

Se 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.

Vlad Cioaba
fonte
6

Caso você queira apenas remover um subconjunto das alterações no seu arquivo, você pode usar:

git reset -p

ou

git reset -p <file_name>

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.

fede1024
fonte
4

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 .

thilinarmtb
fonte
2

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 é

git reset HEAD file_name.ext

ou

git reset HEAD path/to/file/file_name.ext
Do Nhu Vy
fonte
2

Quando você faz isso git status, o Git mostra como desestabilizar:

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

Então git reset HEAD <file>funcionou para mim e as mudanças não foram tocadas.


fonte
2

Acho que você provavelmente se confundiu com o conceito de índice , como comentou @CB Bailey:

A área de preparação é o índice.

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:

você simplesmente deseja "desfazer" o git addque foi feito para esse arquivo.



Aqui está a minha resposta:

Geralmente, existem duas maneiras de desfazer uma operação de estágio , como outras respostas já mencionadas:

git reset HEAD <file>

e

git rm --cached <file>

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 como deletedno diretório temporário , se você usar

git status

Após esta operação, você verá o seguinte:

        deleted:    <file>

É 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 .

Wulfric Lee
fonte
2

Após a versão 2.23, o Git introduziu o git restorecomando que você pode usar para fazer isso. Citando a documentação oficial:

Restaure os caminhos especificados na árvore de trabalho com algum conteúdo de uma fonte de restauração. Se um caminho for rastreado, mas não existir na fonte de restauração, ele será removido para corresponder à fonte.

O comando também pode ser usado para restaurar o conteúdo no índice com --stagedou restaurar a árvore de trabalho e o índice com --staged --worktree.

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.

Mike
fonte
1

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

Ctrl+U (para Windows)

desestabilizá-los.

rite2hhh
fonte
1

Para versões mais recentes do Git existe git restore --staged <file>.

Quando eu faço uma git statusversão com o Git 2.26.2.windows.1, também é recomendado para desestágio:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

( Este post mostra que, nas versões anteriores, git reset HEADera recomendado neste momento)

Posso altamente recomendar este post explicando as diferenças entre git revert, git restoree git resete também parâmetros adicionais para git restore.

Ruik
fonte
0

Minha amostra:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

Como você pode notar

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)
Khang Azun
fonte
-1

Você precisa estar no diretório do arquivo e digite o seguinte no terminal

git reset HEAD .

Suposição é que você precisa redefinir apenas um arquivo.

nevosial
fonte
-4

Para desfazer tudo de uma vez, execute este comando

git reset HEAD -- .
Devendra Verma
fonte
Não é possível adicionar arquivos depois disso.
Karl Morrison
-10

git checkout -- <file>

Funciona perfeitamente para remover arquivos da área de armazenamento temporário

Juan Ramirez
fonte
4
conforme observado abaixo, isso reverte as alterações no arquivo, que está indo um passo além do que o OP deseja.
Stolli 7/08/2015
git rm flie.txt --cached
Juan Ramirez
-11

No meu caso, eu faço

git checkout -- FILE
Maxi Capodacqua
fonte
9
Isso reverteria as alterações no arquivo, não?
Martin Burch