git reset --hard HEAD deixa arquivos não rastreados para trás


584

Quando eu corro git reset --hard HEAD, é suposto redefinir para uma versão original do que você puxou, como eu a entendo. Infelizmente, ele deixa os arquivos por aí, como git statusmostra uma grande lista de arquivos não rastreados.

Como você diz ao git "Basta trazer de volta exatamente o que estava na última tentativa, nada mais, nada menos"?


44
git reset --hardredefine seu índice e reverte os arquivos rastreados de volta ao estado em que estão no HEAD. Deixa arquivos não rastreados em paz.
— Fifigyuri

Respostas:


904

Você precisa usar git clean -f -dpara se livrar de arquivos e diretórios não rastreados em sua cópia de trabalho.

Se você precisar redefinir todo o repositório para dominar, incluindo todos os sub-módulos git, execute este script:

git reset --hard HEAD
git clean -f -d
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule update
git submodule update --init --recursive
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f -d
git submodule foreach git submodule update --init --recursive
git submodule foreach git fetch
git submodule foreach git pull
git status

56
Além disso, -xse você deseja remover seus arquivos .gitignored e voltar ao estado original.
— Jtdubs

44
Adicionar -nao teste seria removido primeiro. combine todos eles em um argumento:-dfn
— HyBRiD 30/12/12

31
Meu comando comum está git clean -qfdxaqui. Remova tudo e faça-o silenciosamente.
— Aragaer # 25/13

3
-d -fpode ser decalred duas vezes -dffpara -d -f -f, isso vai apagar diretórios ALL untracked, incluindo diretórios untracked protegidas.
— ThorSummoner

3
@BKSpurgeon: sim, ele exclui arquivos. O que você quer dizer com "Quero arquivos não rastreados como eram antes"? O Git não sabe nada sobre arquivos não rastreados, exceto que eles existem. Ele não rastreia várias versões desses arquivos (uma vez que não são rastreados ).
— knittl

61

Se você possui arquivos que ainda deseja manter:

git clean -di fará uma limpeza interativa que permite excluir apenas os arquivos / diretórios que você não deseja mais.


48
git reset --hard && git clean -dfx

ou, zsh fornece um alias 'gpristine':

alias gpristine='git reset --hard && git clean -dfx'

O que é realmente útil.

Se estiver trabalhando em um repositório bifurcado, certifique-se de buscar e redefinir o repositório / ramificação correto, por exemplo:

git fetch upstream && git reset --hard upstream/master && git clean -df

8
Desculpas se este não é um comando seguro - eu não estava tentando estar seguro, estava tentando responder à pergunta. Você poderia comentar se isso responde à pergunta?
— Jjnevis

3
Isso funciona bem e deve ser incorporado ao git IMHO (embora eu não tenha certeza se usaria -x rotineiramente). Muitas vezes, estou trabalhando em um projeto local, ainda não sincronizado com o github etc., e um refator confuso vai além do estado de desfazer do IDE. Meu instinto é reverter para o último commit, mas pesquise no Google, pois isso geralmente leva a respostas para o penúltimo commit, não o último commit. Tudo o que eu quero é voltar ao commit mais recente. Isso faz isso. Deve ser uma maneira mais fácil. Obrigado Linus! ;-)
— Dell Anderson

5
É perigoso porque ele também apaga arquivos ignorado com o -xcomo se você tivesse apenas clonado o repo. Se é isso que você quer, é perfeito. Se você deseja excluir arquivos não rastreados , a remoção da -xopção funciona bem.
— Emile Bergeron

2
Agradeço a deus porgpristine
— Snowcrash

2
e exclui configurações intellij;)
— Kalpesh Soni

17

Abordagem interativa do usuário:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i para interativo
-f para forçar
-d para o diretório
-x para arquivos ignorados (inclua se necessário)

Nota: Adicione -n ou --dry-run para verificar apenas o que ele fará.


4

Você pode usar git stash. Você precisa especificar --include-untracked, caso contrário, você terminará com o problema original.

git stash --include-untracked

Em seguida, basta soltar a última entrada no esconderijo

git stash drop

Você pode criar um alias prático para isso e chamar git wipepor exemplo:

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"

2

O comando que você está procurando é git clean


4
Da próxima vez, adicione um pouco mais de descrição / exemplos, etc. O que ajuda o usuário a entender o que ele faz e, nesse caso, quais parâmetros usar.
— rugk

1

git-clean Use para remover arquivos não rastreados na árvore de trabalho. A seguir, estão algumas opções (resumidas) que podem ser usadas com o git cleancomando

-duse quando nenhum caminho for especificado. Então, o git recurse em diretórios não rastreados os remove.

-f/--force Para remover arquivos não rastreados aninhados.

-i/--interactive Mostre o que seria feito e limpe os arquivos interativamente.

-n/--dry-run Mostre o que acontecerá sem remover nada.

-x ignorar arquivos

exemplo: git clean -f -d-> Remova todos os arquivos não rastreados no diretório atual, todos os subdiretórios.


-16

Você pode ter feito uma reinicialização suave em algum momento. Você pode resolver esse problema fazendo

git add .
git reset --hard HEAD~100
git pull

7
Eu não acho que isso é o que o OP queria. Qualquer uma das outras respostas faz um trabalho muito melhor de realmente mostrar como consertar isso.
— Avery

1
Isso também pode ser lento se você tiver muitos arquivos para adicionar.
— Devin G Rhode

4
totalmente não relacionado.
— Azeem Hassni

1
Fazendo isso, os arquivos não rastreados são removidos. Mas, como programadores, todos devem tentar encontrar a solução correta para os problemas sem usar soluções alternativas e sorrir.
— Yuresh Karunanayake
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.