Como descarto alterações na minha cópia de trabalho que não estão no índice?
git
version-control
Somente leitura
fonte
fonte
git-clean
só remove arquivos untracked da árvore de trabalho git-scm.com/docs/git-cleangit-clean -df
pode ser perigoso. Ele excluirá os arquivos não rastreados locais (por exemplo, cobertos por um .gitignore) Leia tudo abaixo com atenção e considere o git checkout. em vezgit status
dá uma sugestão de como fazer isso!git checkout -- .
git status
dá a sugestão:git restore
.git restore
é um novo comando exatamente para esse fim. Veja minha atualização de 2019 .Respostas:
Outra maneira mais rápida é:
Você não precisa incluir
--include-untracked
se não quiser ser completo.Depois disso, você pode soltar esse esconderijo com um
git stash drop
comando, se quiser.fonte
--include-untracked
.git reset
comando também descartará as alterações no índice.git stash
, nem qualquer variedade degit checkout
descartará exclusões sem etapas. De acordo com a saída degit status
, a resposta correta real aqui é algum saborgit reset HEAD
git checkout -- .
faz o trabalho com apenas um comando.Para todos os arquivos não faseados no diretório de trabalho atual, use:
Para um arquivo específico, use:
--
aqui para remover a ambiguidade do argumento .fonte
git status
error: The following untracked working tree files would be overwritten by checkout: ...
.git checkout -- .
significa a mesma coisa quegit checkout .
, exceto que você é explícito sobre o fato de não especificar o nome do ramo. Ambos dizem fazer checkout da versão HEAD no ramo em que estou atualmente '.' ou './'. Se você faz issogit checkout branch-name directory-or-file-name
em geral, você obtém a versão HEAD dodirectory-or-file-name
on branchbranch-name
.Parece que a solução completa é:
git clean
remove todos os arquivos não rastreados ( aviso : embora não exclua os arquivos ignorados mencionados diretamente em .gitignore, ele pode excluir os arquivos ignorados que residem nas pastas ) egit checkout
limpa todas as alterações não faseadas.fonte
git reset --hard
Isso verifica o índice atual do diretório atual, descartando todas as alterações nos arquivos do diretório atual para baixo.
ou isso que verifica todos os arquivos do índice, substituindo os arquivos da árvore de trabalho.
fonte
git checkout .
egit checkout -- .
?git stash save --keep-index
.Limpa a árvore de trabalho removendo recursivamente os arquivos que não estão sob controle de versão, iniciando no diretório atual.
-d
: Remova diretórios não rastreados, além de arquivos não rastreados-f
: Force (pode não ser necessário, dependendo doclean.requireForce
configuração)Corra
git help clean
para ver o manualfonte
Meu favorito é
Isso permite reverter seletivamente os pedaços.
Veja também:
fonte
-p
adiciona uma boa camada extra de segurança. Combine comgit clean -d
para realmente responder ao OP.Como nenhuma resposta sugere a combinação exata de opções que eu uso, aqui está:
Este é o texto de ajuda on-line para as
git clean
opções usadas :-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
-f
opção duas vezes se você realmente deseja remover esse diretório.-f
Se a variável de configuração Git
clean.requireForce
não está definido parafalse
, Git limpo irá se recusar a apagar arquivos ou diretórios a menos que recebam-f
,-n
ou-i
. O Git se recusará a excluir diretórios dentro do.git
subdiretório ou arquivo, a menos que-f
seja dado um segundo .-x
Não use as regras de ignorar de
.gitignore
(por diretório) e$GIT_DIR/info/exclude
, mas ainda use as regras de ignorar fornecidas com as-e
opções. Isso permite remover todos os arquivos não rastreados, incluindo produtos de construção. Isso pode ser usado (possivelmente em conjunto comgit reset
) para criar um diretório de trabalho novo para testar uma compilação limpa.Além disso,
git checkout .
precisa ser feito na raiz do repositório.fonte
git reset --hard
? (que na verdade é equivalente aogit reset --hard HEAD
e deve funcionar qualquer que seja o diretório atual ...)git clean -dfx
, aqui está uma dica que eu uso para estar no lado seguro antes de executá-lo: apenas executegit clean -d -x -n
antes, para exibir a lista de arquivos a serem removidos e confirme a operação executandogit clean -d -x -f
(coloquei o argumento-n
., resp-f
no fim de ser capaz de mudá-lo rapidamente em um terminal).gitignore
, os perderá. Portanto, considere fazer o backup do seu projeto antes disso.Se você deseja apenas remover as alterações nos arquivos existentes , use
checkout
( documentado aqui ).--
) informa ao Git que o que segue deve ser considerado como seu segundo argumento (caminho), que você ignorou a especificação de um ramo..
) indica todos os caminhos.Se você deseja remover os arquivos adicionados desde a sua última confirmação, use
clean
( documentado aqui ):-i
opção inicia um interativoclean
, para evitar exclusões equivocadas.Se você deseja mover as alterações para um espaço de espera para acesso posterior , use
stash
( documentado aqui ):fonte
Eu realmente achei este artigo útil para explicar quando usar o que comando: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
Existem alguns casos diferentes:
Se você não preparou o arquivo, então você o usa
git checkout
. O checkout "atualiza os arquivos na árvore de trabalho para corresponder à versão no índice". Se os arquivos não tiverem sido testados (ou seja, adicionados ao índice) ... esse comando reverterá essencialmente os arquivos para o seu último commit.git checkout -- foo.txt
Se você preparou o arquivo temporariamente, use git reset. Redefinir altera o índice para corresponder a uma confirmação.
git reset -- foo.txt
Suspeito que o uso
git stash
seja uma escolha popular, pois é um pouco menos perigoso. Você sempre pode voltar a ele se acidentalmente explodir demais ao usar o git reset. A redefinição é recursiva por padrão.Dê uma olhada no artigo acima para obter mais conselhos.
fonte
A maneira mais fácil de fazer isso é usando este comando:
Este comando é usado para descartar alterações no diretório de trabalho -
https://git-scm.com/docs/git-checkout
No comando git, a armazenagem de arquivos não rastreados é obtida usando:
http://git-scm.com/docs/git-stash
fonte
.
o final. Para o futuro: o período é essencial !git clean -fd
para limpar arquivos que não estão no índice.Se você não está interessado em manter as alterações não organizadas (especialmente se as alterações organizadas são novos arquivos), achei útil:
fonte
git checkout -f
man git-checkout
:-f, --force
Ao alternar ramificações, continue mesmo se o índice ou a árvore de trabalho diferirem de HEAD. Isso é usado para jogar fora as alterações locais.
Ao fazer o check-out de caminhos do índice, não falhe nas entradas não imersas; em vez disso, entradas não mescladas são ignoradas.
fonte
Conforme você digita o status do git, (use "git checkout - ..." para descartar as alterações no diretório de trabalho) é mostrado.
por exemplo
git checkout -- .
fonte
Você pode usar o git stash - se algo der errado, você ainda poderá reverter a partir do stash. Semelhante a alguma outra resposta aqui, mas esta também remove todos os arquivos não faseados e também todas as exclusões não faseadas:
se você verificar se está tudo bem, jogue fora o esconderijo:
A resposta de Bilal Maqsood com
git clean
também funcionou para mim, mas com o esconderijo eu tenho mais controle - se eu o fizer acidentalmente, ainda posso recuperar minhas alteraçõesATUALIZAR
Acho que há mais uma alteração (não sei por que isso funcionou para mim antes):
git add . -A
ao invés degit add .
sem os
-A
arquivos removidos não serão testadosfonte
Atualização de 2019:
Desde julho 2019 , houve um novo comando que faz exatamente isso:
git restore
.Em
git status
, agora Git recomenda usar este comando em vez degit checkout
como ele costumava fazer.Embora esse comando também possa ser usado para restaurar a árvore de trabalho para uma confirmação específica ou para restaurar o conteúdo do índice, por padrão, a árvore de trabalho é restaurada para o estado no índice (o que é solicitado aqui).
Portanto, para restaurar os arquivos que correspondem a um pathspec (se livrando de suas alterações não estágios), você deve:
Por exemplo, para restaurar todas as alterações não faseadas no diretório atual, você pode executar:
Se você executar isso a partir da raiz do projeto, ele restaurará todas as alterações não-estágios em todo o repositório.
Observe que, como em
git checkout -- .
(como indicado por Mariusz Nowak), isso descartará apenas as alterações nos arquivos rastreados pelo Git e não descartará nenhum novo arquivo não rastreado. Se você deseja descartar as alterações não faseadas, incluindo novos arquivos não rastreados, poderá executar um adicional:No entanto, tenha muito cuidado com este comando posterior, pois você pode descartar arquivos dos quais não pretendia se livrar.
Nota sobre
git restore
: como este é um novo comando, sua página de manual emite um aviso:Portanto, é possível que essa resposta fique desatualizada se o comportamento mudar no futuro. Portanto, pode ser aconselhável executar um rápido
man git-restore
antes de usá-lo.fonte
git restore .
funcionasse perfeitamente. Obrigado.git restore <filename>
e funcionou perfeitamente.git restore .
restaura todos os arquivos no diretório atual, não em todo o repositório.Em vez de descartar as alterações, redefino o controle remoto para a origem. Nota - este método é restaurar completamente sua pasta para a pasta do repositório.
Então, faço isso para garantir que eles não fiquem lá quando eu reiniciar o git (mais tarde - exclui gitignores no Origin / branchname)
NOTA: Se você deseja manter os arquivos ainda não rastreados, mas não em GITIGNORE, pode pular esta etapa, pois limpará esses arquivos não rastreados não encontrados no repositório remoto (obrigado @XtrmJosh).
Então eu
Então eu redefinir para origem
Isso colocará de volta à estaca zero. Assim como a re-clonagem da ramificação, mantendo todos os meus arquivos marcados com local e localmente.
Atualizado por comentário do usuário abaixo: Variação para redefinir o para qualquer ramo atual em que o usuário esteja.
fonte
git reset --hard @{u}
que redefine o ramo para onde o ramo de rastreamento remoto atual éTentei todas as soluções acima, mas ainda não conseguia se livrar de arquivos novos e sem etapas.
Use
git clean -f
para remover esses novos arquivos - com cuidado! Observe a opção de força.fonte
simplesmente diga
Ele removerá todas as suas alterações locais. Você também pode usar mais tarde dizendo
ou git stash pop
fonte
Apenas use:
Feito. Fácil.
Se você realmente se importa com sua pilha de stash, pode seguir com
git stash drop
. Mas, nesse ponto, é melhor usar (de Mariusz Nowak):No entanto, eu gosto
git stash -u
mais porque ele "descarta" todas as alterações rastreadas e não rastreadas em apenas um comando . No entanto,git checkout -- .
única devoluções alterações controladas egit clean -df
mudanças só devoluções untracked ... e digitando os dois comandos é muito muito trabalho :)fonte
git stash -u
em breve (Git 2.14.x / 2.15, terceiro trimestre de 2017) evoluirá um pouco: stackoverflow.com/a/46027357/6309git stash -k
na minha opinião.Para fazer um descarte permanente:
git reset --hard
Para salvar as alterações para mais tarde:
git stash
fonte
Isso funciona mesmo em diretórios que são; fora das permissões normais do git.
Aconteceu comigo recentemente
fonte
git help clean
"-d Remover diretórios não rastreados, além de arquivos não rastreados".você tem um comando git muito simples
git checkout .
fonte
fonte
Na minha opinião,
deve fazer o truque. Conforme documentação do Git no git clean
Descrição
Opções
fonte
Independentemente do estado do seu repo, você sempre pode redefinir para qualquer confirmação anterior:
Isso descartará todas as alterações feitas após a confirmação.
fonte
Outra maneira de se livrar de novos arquivos mais específicos do que o git clean -df (isso permitirá que você se livre de alguns arquivos, não necessariamente de todos), é adicionar os novos arquivos ao índice primeiro, depois esconder e soltar o botão esconderijo.
Essa técnica é útil quando, por algum motivo, você não pode excluir facilmente todos os arquivos não rastreados por algum mecanismo comum (como rm).
fonte
O que se segue é realmente apenas uma solução se você estiver trabalhando com uma bifurcação de um repositório onde você sincroniza regularmente (por exemplo, solicitação de recebimento) com outro repositório. Resposta curta: exclua fork e refork, mas leia os avisos no github .
Eu tive um problema semelhante, talvez não idêntico, e lamento dizer que minha solução não é ideal, mas é, em última análise, eficaz.
Eu geralmente teria mensagens de status do git como esta (envolvendo pelo menos 2/4 arquivos):
Um olho atento notará que esses arquivos têm dopplegangers que são uma única letra no caso de desligamento. De alguma forma, e não tenho idéia do que me levou a seguir esse caminho (como eu não estava trabalhando com esses arquivos no repositório upstream), eu havia trocado esses arquivos. Experimente as muitas soluções listadas nesta página (e em outras páginas) que parecem não ajudar.
Consegui resolver o problema excluindo meu repositório bifurcado e todos os repositórios locais e reforçando. Isso por si só não foi suficiente; o upstream teve que renomear os arquivos em questão para novos nomes de arquivos. Contanto que você não tenha nenhum trabalho não solicitado, wikis e problemas que divergem do repositório upstream, você deve estar bem. O rio acima pode não estar muito feliz com você, para dizer o mínimo. Quanto ao meu problema, é sem dúvida um erro do usuário, pois não sou tão proficiente com o git, mas o fato de estar longe de ser fácil corrigir pontos de um problema com o git também.
fonte
Quando você deseja transferir um estoque para outra pessoa:
[editar] como comentado, é possível nomear esconderijos. Bem, use isso se você quiser compartilhar seu estoque;)
fonte
git stash save "Feature X work in progress"
.Você pode criar seu próprio apelido, que descreve como fazê-lo de maneira descritiva.
Eu uso o próximo alias para descartar as alterações.
Descartar alterações em um (lista de) arquivos na árvore de trabalho
Em seguida, você pode usá-lo como o próximo para descartar todas as alterações:
Ou apenas um arquivo:
Caso contrário, se você quiser descartar todas as alterações e também os arquivos não rastreados, utilizo uma combinação de checkout e clean:
Limpar e descartar alterações e arquivos não rastreados na árvore de trabalho
Portanto, o uso é simples como a seguir:
Agora está disponível no próximo repositório do Github, que contém muitos aliases:
fonte
Eu tive uma situação estranha em que um arquivo está sempre sem estágio, isso me ajuda a resolver.
fonte