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?


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


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


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 .


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.


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


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

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.


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.


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.


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


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.



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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.