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"?

Karl
fonte
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
knittl
fonte
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.

Sogger
fonte
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
jjnevis
fonte
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á.

bit_cracker007
fonte
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"
Nikola Diklic
fonte
2

O comando que você está procurando é git clean

Jagriti Kumari
fonte
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.

Yuresh Karunanayake
fonte
-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
user3780587
fonte
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