git: desfaz todas as alterações de diretório em funcionamento, incluindo novos arquivos

1151

Como excluir todas as alterações do diretório ativo, incluindo novos arquivos não rastreados. Eu sei dissogit checkout -f faz isso, mas não exclui novos arquivos não rastreados criados desde a última confirmação.

Alguém tem uma idéia de como fazer isso?

Aler
fonte
1
@ Joel & Wayfarer: por que você não tenta git help resetegit help clean
SHernandez
3
Fazendo um alias para isso no seu git config é uma boa ideia;)
anubina

Respostas:

1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

Para ver o que será excluído antes, sem realmente excluí-lo, use o -nsinalizador (isso é basicamente uma execução de teste). Quando você estiver realmente pronto para excluir, remova a -nbandeira:

git clean -nfd

BKSpurgeon
fonte
16
Nota: o git reset --hard remove as mudanças faseadas, bem como as mudanças do diretório de trabalho. Além disso, o git clean -f -d é provavelmente o oposto de adicionar um novo arquivo não rastreado. Da pergunta, o solicitante pode estar bastante satisfeito com seu conjunto atual de arquivos ignorados.
CB Bailey
7
Leia a próxima resposta e preste atenção na opção -x. (Pode também remover sua configuração local, como / arquivos db-configurações de senha por exemplo database.yml.)
Boris
9
Essa opção -x é desnecessária e um pouco perigosa neste caso.
Tim Gautier
66
git clean -fxdpode realmente ser realmente perigoso se você não souber o que está fazendo. Você pode acabar excluindo permanentemente alguns arquivos não rastreados muito importantes, como seu banco de dados, etc. Tenha cuidado.
Mason Stewart
10
Observe que git clean -f -dtambém excluirá arquivos de pastas ignoradas. Portanto, todos os logs locais e coisas assim desaparecerão. Geralmente não é um grande problema, mas é melhor saber.
Cyriel
299

Método mais seguro, que eu uso com freqüência:

git clean -fd

Explicação da sintaxe conforme a /docs/git-cleanpágina:

  • -f (alias: --force . Se a variável de configuração do Git clean.requireForce não estiver definida como false, o git clean se recusará a excluir arquivos ou diretórios, a menos que seja fornecido -f, -n ou -i. O Git se recusará a excluir diretórios com o subdiretório ou arquivo .git, a menos que um segundo -f seja fornecido.
  • -d. Remova os diretórios não rastreados, além dos arquivos não rastreados. Se um diretório não rastreado for gerenciado por um repositório Git diferente, ele não será removido por padrão. Use a opção -f duas vezes se você realmente deseja remover esse diretório.

Conforme mencionado nos comentários, pode ser preferível fazer uma git clean -ndexecução a seco e informar o que seria excluído antes de realmente excluí-lo.

Link para a git cleanpágina do documento: https://git-scm.com/docs/git-clean

Heath Dutton
fonte
124
Eu sempre git clean -nd .antes de realmente apagar arquivos usandogit clean -fd .
tbear
14
Por quê? Você pode explicar os detalhes, por favor.
Greg B
31
A opção per git clean -n é na verdade uma execução seca que não remove nada, apenas mostra o que será feito.
precisa saber é o seguinte
2
@ tbear, você sempre pode fazer um add -A+ commit -a+ em branco revert headantes git clean. A revisão de cada exclusão simplesmente não é dimensionada para os principais cenários. Além disso, corrida a seco não é uma bala de prata: e se você perdeu alguma coisa ou cometeu um erro durante a revisão?
Pacerier
1
Isso remove arquivos, mas não desfaz modificações.
Donquixote
202

Para todos os arquivos não faseados, use:

git checkout -- .

o . no final é importante.

Você pode substituir .por um nome de subdiretório para limpar apenas um subdiretório específico do seu projeto. O problema é tratado especificamente aqui .

jfountain
fonte
7
@Vincent: O - evita erros de digitação dizendo ao comando checkout que não há mais parâmetros especificados. Sem eles, você poderia terminar com uma nova ramificação, em vez de redefinir a atual!
Igor Rodriguez
2
Esta é a rota mais segura, mas não removerá arquivos não rastreados (arquivos adicionados recentemente).
usar o seguinte código
5
Isso não restaura arquivos excluídos, mas não confirmados.
Cerin
Apenas para sua informação. Eu perdi isso. Verifique se você está no diretório em que deseja excluir as alterações não faseadas. Por exemplo, eu tive alterações em 2 arquivos diferentes em locais diferentes em uma filial, ou seja: src/app/work/filename.jse ../app/working/test/filename.js. Apenas o uso git checkout -- .no ramo excluiu apenas o primeiro arquivo ( sem os principais ../ ). Então eu tive que cd ../entrar no segundo diretório de localização para excluir o segundo arquivo usando esse comando.
precisa
57

Dê uma olhada no git cleancomando.

git-clean - Remove arquivos não rastreados da árvore de trabalho

Limpa a árvore de trabalho removendo recursivamente os arquivos que não estão sob controle de versão, iniciando no diretório atual.

Normalmente, apenas os arquivos desconhecidos pelo git são removidos, mas se a opção -x for especificada, os arquivos ignorados também serão removidos. Por exemplo, isso pode ser útil para remover todos os produtos de construção.

Greg Hewgill
fonte
Eu tentei git clean -ie escolhi "limpar" no menu - isso finalmente removeu novos arquivos.
Sany
43

Os seguintes trabalhos:

git add -A .
git stash
git stash drop stash@{0}

Observe que isso descartará as alterações locais em etapas e em etapas. Portanto, você deve confirmar o que deseja manter antes de executar esses comandos.

Um caso de uso típico: você moveu muitos arquivos ou diretórios e deseja voltar ao estado original.

Créditos: https://stackoverflow.com/a/52719/246724

Don Quixote
fonte
1
Por que você está referenciando stash @ {0} em vez de apenas git stash drop?
Maikel
Honestamente, eu não me lembro :)
Donquixote
Este funcionou. Como nota, verifique se você está no diretório inicial ( git add -A .). Perdi 30m porque não houve correspondência de arquivos. Obrigado!
User9869932
Eu costumava usar essa abordagem, e ela tem mérito. No entanto, desde então, achei as soluções propostas por jfountain e Heath Dutton mais aptas ao problema original, IMHO.
HeyZiko
2
git stash de queda esconderijo @ {0} cai mais recente esconderijo se você fez git stash cairia todos os esconderijos que você fez
DonatasD
42

Você pode fazer isso em duas etapas:

  1. Reverter arquivos modificados: git checkout -f
  2. Remova arquivos não rastreados: git clean -fd
Gerard de Visser
fonte
3
+1 porque é simples. Também porque funciona e faz exatamente o que o OP quer sem assustá-los com omg, isso excluirá tudo.
Geekzster 21/03/19
30

Eu pensei que era ( aviso: a seguir vai acabar com tudo )

$ git reset --hard HEAD
$ git clean -fd

O resetpara desfazer as alterações. O cleanpara remover qualquer não controlada de f iles e d irectories.

skube
fonte
Isso não trabalho, eu ainda receber um aviso de conflito ao fazer um git pulldepois: CONFLICT (content): Merge conflict in...eu só resolveu este por umgit pull --strategy=ours
rubo77
7
git reset --hard origin/{branchName}

Ele excluirá todos os arquivos não rastreados.

santosh kumar
fonte
4

git clean -imostrará primeiro os itens a serem excluídos e prosseguirá após a sua confirmação. Acho isso útil ao lidar com arquivos importantes que não devem ser excluídos acidentalmente.

Consulte git help cleanpara obter mais informações, incluindo algumas outras opções úteis.

Taiga
fonte
4

Se você quiser descartar todas as alterações, poderá usar qualquer uma das opções válidas em um alias em .gitconfig. Por exemplo:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

Uso: git discard

Agorreca
fonte
1
Esse apelido eu gosto muito
flags
3

Uma solução alternativa é confirmar as alterações e depois se livrar delas. Isso não tem um benefício imediato a princípio, mas abre a possibilidade de confirmar em partes e criar uma tag git para backup.

Você pode fazer isso na ramificação atual, assim:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

Ou você pode fazê-lo na cabeça desanexada. (supondo que você comece na ramificação BRANCHNAME):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

No entanto, o que eu costumo fazer é confirmar em partes, depois nomeie algumas ou todas as confirmações como "DISCARD: ...". Em seguida, use o rebase interativo para remover os commits ruins e manter os bons.

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

Isso é mais detalhado, mas permite revisar exatamente quais alterações você deseja descartar.

Os atalhos git lolegit lola foram muito úteis com este fluxo de trabalho.

Don Quixote
fonte
3

Para uma pasta específica, usei:

git checkout -- FolderToClean/*
Glauco Neves
fonte
3
Isso não exclui arquivos não rastreados, como afirma o OP.
precisa saber é
0

Esta é provavelmente uma resposta noob, mas: Eu uso o TortoiseGit para Windows e ele possui um recurso interessante chamado REVERT. Portanto, o que você faz para reverter suas alterações não-estocadas não-estaduais locais é:

  1. abrir um menu de contexto para a pasta necessária e selecionar reverter, mostra um pop-up de reversão onde você pode selecionar os arquivos alterados para reverter / recuperar.
  2. Se você também deseja excluir arquivos adicionados (que ainda não estão no git), clique em confirmar (no mesmo menu de contexto), ele exibe o pop-up Confirmar e mostra os arquivos adicionados, clique com o botão direito do mouse em cada um deles e escolha excluir. Mas não pressione Commit btn neste pop-up, pois você não deseja confirmar, mas apenas veja os arquivos adicionados e exclua-os daqui.
Oleg Vorontsov
fonte