Como remover um arquivo do índice no git?

356

Como remover um arquivo do índice (= área de armazenamento temporário = cache) sem removê-lo do sistema de arquivos?

hcs42
fonte
5
Você quer dizer "redefinir o que havia antes" ou "excluir, porque não quero mais esse arquivo"?
Andrew Aylett
No meu caso é o mesmo porque o arquivo não existia antes ...
hcs42

Respostas:

505

Você quer:

git rm --cached [file]

Se você omitir a --cachedopção, ela também será excluída da árvore de trabalho. git rmé um pouco mais seguro que git reset, porque você será avisado se o conteúdo preparado não corresponder à ponta da ramificação ou ao arquivo no disco. (Caso contrário, você deve adicionar --force.)

John Feminella
fonte
8
Isso também funciona muito bem se, por exemplo, você registrou acidentalmente alguns intermediários de compilação ou arquivos de configuração local que não entraram no seu .gitignore; use git rm --cachedpara removê-los do repositório, adicione os arquivos ou diretórios relevantes ao .gitignore, prepare e confirme normalmente. Eles serão retirados do repositório, mas permanecerão intocados na árvore local e você não fará o check-in acidentalmente novamente.
Ionoclast Brigham
22
Isso também exclui o arquivo do repositório (remoto) após você confirmar e enviar por push.
powder366
6
Isso não o remove do índice, mas o marca como excluído no índice.
JotaBe
4
Essa resposta provavelmente está errada, pois remove um arquivo do repositório (como @ powder366 já mencionado) que não é o resultado pretendido.
Otomo
11
Esta solução não funcionou para mim. Marcou o arquivo especificado como excluído e o remove do repositório local.
paiego 18/11/19
134

Isso deve desestabilizar um <arquivo> para você (sem remover ou modificar o arquivo):

git reset <file>
David Underhill
fonte
6
Isso remove a alteração mais recente do arquivo específico, mas a mantém no repositório (remoto) após confirmação e envio.
powder366
11
Esta é a resposta que eu estava procurando. Observe que você não precisa especificar HEAD.
Michael Dorst
Bom ponto @MichaelDorst. Atualizei a resposta para omitir HEAD!
David Underhill
3
git reset HEAD <file> 

para remover um arquivo específico do índice.

e

git reset HEAD

para remover todos os arquivos indexados.

Abdul Gafoor
fonte
1

Dependendo do seu fluxo de trabalho, este pode ser o tipo de coisa que você raramente precisa, de modo que não há muito sentido em tentar descobrir uma solução de linha de comando (a menos que você esteja trabalhando sem uma interface gráfica por algum motivo).

Basta usar uma das ferramentas baseadas em GUI que oferecem suporte ao gerenciamento de índice, por exemplo:

  • git gui <- usa a estrutura de janelas Tk - estilo semelhante ao gitk
  • git cola <- uma interface GUI de estilo mais moderno

Isso permite que você mova os arquivos para dentro e para fora do índice ao apontar e clicar. Eles ainda têm suporte para selecionar e mover partes de um arquivo (alterações individuais) para e do índice.


Que tal uma perspectiva diferente: se você errar ao usar um dos comandos sugeridos, um tanto enigmáticos:

  • git rm --cached [file]
  • git reset HEAD <file>

... você tem uma chance real de perder dados - ou pelo menos dificultar a localização. A menos que você realmente precise fazer isso com uma frequência muito alta, é provável que o uso de uma ferramenta GUI seja mais seguro .


Trabalhando sem o índice

Com base nos comentários e votos, percebi que muitas pessoas usam o índice o tempo todo. Eu não. Aqui está como:

  • Confirme minha cópia de trabalho inteira (o caso típico): git commit -a
  • Confirme apenas alguns arquivos: git commit (list of files)
  • Comprometa todos, mas alguns arquivos modificados: git commit -aem seguida, alterar viagit gui
  • Revise graficamente todas as alterações na cópia de trabalho: git difftool --dir-diff --tool=meld
nobar
fonte
@ Martin: Eu acho que depende do seu fluxo de trabalho. Na minha abordagem, nunca uso o índice diretamente. Quando quero salvar meu trabalho, apenas faço confirmações completas git commit -a. Quando eu estava respondendo a essa pergunta, foi porque havia feito (uma exótica) " escolha inversa da cereja " que coloca os arquivos no índice para você, mas eu queria editar um arquivo antes de confirmar. Tirei o arquivo do índice enquanto o editava para que as diferenças funcionassem da maneira que estou acostumado.
Nobar
meu caso de uso era muito estreito e inútil: criar um ramo; adicione uma pasta cheia de arquivos apenas para ramificação; mudar para mestre; mesclar; ops, adicionou uma pasta errada para dominar, adicione-a ao gitignore; os arquivos não seriam removidos da confirmação de confirmação, uma solução melhor seria usar rmimediatamente, mas primeiro pensei que alternar ramos não mataria a pasta ignorada . mas ... Eu uso a ferramenta "baseada em gui" do github, que é boa o suficiente para mim e suporta algum gerenciamento de índice, exceto que não suporta isso. Então, o que devo usar 2 GUIs para uso restrito? ainda não posso concordar com a resposta.
cregox
3
Esta é uma resposta decididamente impopular. No entanto, tenho certeza de que a abordagem que sugiro é a correta para algumas pessoas (inclusive eu). Eu uso uma dessas ferramentas para manipular o índice algumas vezes por ano.
No20 /
11
Atualmente, os editores de programação e IDEs provavelmente suportam a manipulação gráfica de índices. Pelo menos o Atom do GitHub faz.
Nobar
11
Eu prefiro uma interface CLI sobre GUI a qualquer dia, mesmo que seja mais perigoso. Ele permitirá que eu use o git mesmo sem a GUI, o que eu acho reconfortante (em vez de me perder quando não consigo instalar essas ferramentas em um servidor remoto, por exemplo). Tudo o que disse que essa resposta é perfeitamente válida e não merece votos negativos "elitistas", +1 por fornecer uma boa alternativa gui!
SidOfc