Uma dúvida comum ao começar a usar o Git é "Como dizer ao Git para não rastrear mais um arquivo (ou arquivos)?". O comando git rm é usado para remover arquivos de um repositório do Git. Ele pode ser considerado como o inverso do comando git add.

Visão geral do Git rm

O comando git rm pode ser usado para remover arquivos individuais ou uma coleção de arquivos. A função principal do git rm é remover os arquivos rastreados do índice do Git. Além disso, o git rm pode ser usado para remover arquivos do índice de staging e do diretório de trabalho. Não existe opção de remover um arquivo de apenas um diretório de trabalho. Os arquivos sendo operadores devem ser idênticos aos arquivos no HEAD atual. Se houver uma diferença entre a versão do HEAD de um arquivo e a versão do índice de staging ou da árvore de trabalho, o Git vai bloquear a remoção. O bloqueio é um mecanismo de segurança para evitar a remoção de mudanças em andamento.

Observe que o git rm não remove as ramificações. Saiba mais sobre o uso de ramificações do git

Uso

<file>…​

Especifica os arquivos a serem removidos. O valor da opção pode ser um arquivo individual, uma lista de arquivos delimitada por espaços, file 1 file 2 file 3, ou um glob de arquivo curinga, (~./directory/*).

-f
--force

A opção -f é usada para substituir a verificação de segurança que o Git faz para garantir que os arquivos no HEAD correspondam ao conteúdo atual no índice de staging e no diretório de trabalho.

-n
--dry-run

A opção "dry run" é uma proteção que vai executar o comando git rm, porém não vai excluir de fato os arquivos. Em vez disso, ela vai exibir quais arquivos ela teria removido.

-r

A opção -r é uma abreviação para "recursive". Ao operar no modo recursive, o git rm vai remover um diretório alvo e todos os conteúdos dele.

--

A opção de separador é usada para fazer a distinção explícita entre uma lista de nomes de arquivos e os argumentos sendo transmitidos ao git rm. Isto é útil se algum dos nomes de arquivo tiver uma sintaxe que possa ser confundida com outras opções.

--cached

A opção em cache especifica que a remoção deveria ocorrer apenas no índice de staging. Os arquivos do diretório de trabalho vão permanecer iguais.

--ignore-unmatch

Isto faz com que o comando feche com um status sigterm 0, mesmo se nenhum arquivo corresponder. Este é um código de status de nível Unix. O código 0 indica uma invocação bem-sucedida do comando. A opção --ignore-unmatch pode ser útil ao usar git rm como parte de um script de shell maior que precisa ter função de falha controlada.

-q
--quiet

A opção silenciosa oculta o resultado do comando git rm. O comando costuma resultar em uma linha para cada arquivo removido.

Como desfazer o git rm

A execução de git rm não é uma atualização permanente. O comando vai atualizar o índice de staging e o diretório de trabalho. Estas mudanças não vão persistir até que uma nova confirmação seja criada e as mudanças sejam adicionadas ao histórico de confirmações. Isto significa que as mudanças aqui podem ser "desfeitas" usando comandos comuns de Git.

git reset HEAD

Uma redefinição vai reverter o índice de staging atual e o diretório de trabalho de volta à confirmação de HEAD. Isto vai desfazer um git rm.

git checkout .

Um checkout vai ter o mesmo efeito e vai restaurar a versão mais recente de um arquivo do HEAD.

Caso o git rm tenha sido executado e uma nova confirmação criada e persistente à remoção, o git reflog pode ser usado para encontrar uma referência anterior à execução de git rm. Saiba mais sobre o uso de git reflog.

Discussão

O argumento <file> fornecido ao comando pode ser de caminhos exatos, padrões de glob de arquivo curinga ou nomes exatos de diretórios. O comando remove apenas os caminhos confirmados no momento no repositório do Git.

O globbing de arquivos curinga corresponde entre os diretórios. É importante ter cuidado ao usar globs curingas. Considere os exemplos: diretório/* e diretório*. O primeiro exemplo vai remover todos os subarquivos de diretório/, enquanto o segundo exemplo vai remover todos os diretórios irmãos, como diretório1diretório2diretório_algo, que pode ser um resultado inesperado.

O escopo do Git rm

O comando git rm opera apenas na ramificação atual. O evento de remoção é aplicado apenas às árvores do diretório de trabalho e do índice de staging. A remoção de arquivos não é persistente no histórico do repositório até que uma nova confirmação seja criada.

Por que usar git rm em vez de rm

Um repositório do Git vai reconhecer quando um comando rm de shell regular for executado em um arquivo que está rastreando. Ele vai atualizar o diretório de trabalho para refletir a remoção. Ele não vai atualizar o índice de staging com a remoção. Um comando adicional git add vai precisar ser executado nos caminhos do arquivos removidos para adicionar as mudanças ao índice de staging. O comando git rm age como um atalho uma vez que vai atualizar o diretório de trabalho e o índice de staging com a remoção.

Exemplos

git rm Documentation/\*.txt

Este exemplo usa um glob de arquivo curinga para remover todos os arquivos *.txt filhos do diretório da Documentação e quaisquer subdiretórios.

Observe que o asterisco * é escapado com barras neste exemplo; esta é uma proteção que evita que o shell expanda o curinga. O curinga, então, expande os nomes de caminho dos arquivos e subdiretórios sob o diretório Documentação/.

git rm -f git-*.sh

Este exemplo usa a opção force e é direcionada a todos os arquivos git-*.sh curingas. A opção force remove os arquivos de destino do diretório de trabalho e do índice de staging.

Como remover arquivos que não estão mais no sistema de arquivos

Conforme dito acima em "Por que usar git rm em vez de rm", o git rm é, na verdade, um comando simples que combina o shell rm padrão e o git add para remover um arquivo do diretório de trabalho e promover a remoção para o índice de staging. Um repositório pode ficar em um estado complicado caso diversos arquivos tenham sido removidos usando apenas o comando rm de shell padrão.

Se a intenção é gravar todos os arquivos com remoção explícita como parte da próxima confirmação, o git commit -a vai adicionar todos os eventos de remoção ao índice de staging em preparação para a próxima confirmação.

No entanto, se a intenção for fazer a remoção persistente dos arquivos que foram removidos com o rm de shell, use o comando a seguir:

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

Este comando vai gerar uma lista dos arquivos removidos do diretório de trabalho e encaminhar esta lista para git rm --cached, que vai atualizar o índice de staging.

Resumo do Git rm

git rm é um comando que opera em duas das árvores de gerenciamento de estado interno do Git primário: o diretório de trabalho e o índice de staging. Ogit rm é usado para remover um arquivo de um repositório do git. É um método simples que combina o efeito do comando rm de shell padrão com git add. Isto significa que ele primeiro vai remover um alvo do sistema de arquivos e depois vai adicionar o evento de remoção ao índice de staging. O comando é um dos muitos que podem ser usados para desfazer mudanças no Git.