Como recusar mudanças não especificadas no Git?

Como faço para desfazer as alterações na minha cópia de trabalho que não estão listadas no índice?

3956
09 сент. Readonly set 09 set. 2008-09-09 22:33 '08 às 10:33 pm 2008-09-09 22:33
@ 32 respostas
  • 1
  • 2

Outra maneira rápida:

 git stash save --keep-index --include-untracked 

Você não precisa incluir --include-untracked se não quiser ser --include-untracked .

Depois disso, você pode redefinir este carimbo com o comando git stash drop se desejar.

2225
09 сент. Resposta dada por Greg Hewgill em 09/09 2008-09-09 22:39 '08 às 10:39 pm 2008-09-09 22:39

Para todos os arquivos não instalados, use:

 git checkout -- . 

Para um uso de arquivo específico:

border=0
 git checkout path/to/file/to/revert 

Certifique-se de especificar o período no final.

4303
09 сент. A resposta é dada Tobi 09 de setembro 2008-09-09 22:37 '08 às 10:37 pm 2008-09-09 22:37

Parece que a solução completa:

 git clean -df git checkout -- . 

git clean remove todos os arquivos não processados ​​( aviso ), enquanto ele não exclui os arquivos ignorados mencionados diretamente no .gitignore, ele pode remover os arquivos ignorados nas pastas ), e o git checkout limpa todas as alterações não especificadas.

1643
29 авг. Resposta dada por Mariusz Nowak 29 ago 2012-08-29 21:28 '12 às 21:28 2012-08-29 21:28

Isso verifica o índice atual do diretório atual, descartando todas as alterações nos arquivos do diretório atual.

 git checkout . 

ou isto, que verifica todos os arquivos do índice, sobrescrevendo os arquivos de trabalho da árvore.

 git checkout-index -a -f 
283
20 июня '09 в 13:28 2009-06-20 13:28 a resposta é dada por CB Bailey em 13:28 2009-06-20 13:28
 git clean -df 

Limpa a árvore de trabalho excluindo recursivamente os arquivos que não estão sob controle de versão, começando com o diretório atual.

-d : exclui diretórios desnecessários além de arquivos sem rastreio

-f : Force (pode não ser necessário dependendo da configuração clean.requireForce )

Execute git help clean para visualizar o tutorial.

218
07 дек. Resposta dada por Elvis Ciotti Dez 07 2011-12-07 16:09 '11 às 16:09 2011-12-07 16:09

Meu favorito

 git checkout -p 

Isso permite que você retorne peças seletivamente.

Veja também:

 git add -p 
85
10 окт. resposta dada Ben Oct 10 2014-10-10 15:31 '14 às 15:31 2014-10-10 15:31

Como nenhuma resposta oferece uma variante exata da combinação que eu uso, aqui está:

 git clean -dfx git checkout . 

Este é o texto de ajuda online para as opções de git clean do git clean usadas:

-d

Exclua diretórios desnecessários além dos arquivos brutos. Se um diretório não assinado for gerenciado por outro repositório Git, ele não será excluído por padrão. Use a opção -f duas vezes se você realmente quiser remover esse diretório.

-f

Se a variável de configuração Git clean.requireForce não estiver configurada para false , o Git clean recusará a remoção de arquivos ou diretórios, a menos que -f , -n ou -i especificado. O Git se recusará a deletar diretórios em um subdiretório .git ou arquivo, se não -f segundo -f .

-x

Não use as regras de ignorar de .gitignore (para cada diretório) e $GIT_DIR/info/exclude , mas ainda use as regras de ignorar especificadas com as opções -e . Isso permite que você exclua todos os arquivos não processados, incluindo a montagem de produtos. Isso pode ser usado (possivelmente em conjunto com o git reset ) para criar um diretório de trabalho intocado para verificar se há uma compilação limpa.

Além disso, git checkout. deve ser executado na raiz do repositório.

68
28 апр. Resposta dada por Martin G 28 abr. 2016-04-28 22:46 '16 às 22:46 2016-04-28 22:46

Na verdade, achei este artigo útil para explicar quando usar o comando: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

Existem vários casos diferentes:

  • Se você não colocou o arquivo, use o git checkout . O check-out "atualiza arquivos na árvore de trabalho de acordo com a versão no índice". Se os arquivos não foram entregues (também adicionados ao índice) ... este comando retornará essencialmente os arquivos para a sua última correção.

    git checkout -- foo.txt

  • Se você colocar o arquivo, use git reset. Redefinir altera o índice de acordo com a correção.

    git reset -- foo.txt

Eu suspeito que usar o git stash é uma escolha popular, pois é um pouco menos perigoso. Você sempre pode retornar a ela se acidentalmente excluir muito ao usar o git reset. A redefinição é recursiva por padrão.

Dê uma olhada no artigo acima para mais dicas.

53
14 авг. a resposta é dada blak3r 14 ago. 2012-08-14 00:31 '12 em 0:31 2012-08-14 00:31

A maneira mais fácil de fazer isso é usar este comando:

Este comando é usado para desfazer mudanças no diretório de trabalho -

 git checkout -- . 

https://git-scm.com/docs/git-checkout

No comando git, a colagem de arquivos brutos é obtida usando:

 git stash -u 

http://git-scm.com/docs/git-stash

45
12 апр. Responder AHM Forhadul Islam 12 de abr 2017-04-12 12:27 '17 às 12:27 2017-04-12 12:27

Se você não está interessado em salvar alterações não especificadas (especialmente se as alterações em fases forem novos), achei conveniente:

 git diff | git apply --reverse 
41
28 июля '11 в 8:27 2011-07-28 08:27 a resposta é dada por Joshua Kunzmann 28 de julho, '11 at 8:27 2011-07-28 08:27

Quando você inserir o status git (use "git checkout -..." para descartar as alterações no diretório de trabalho) .

por exemplo. git checkout -- .

39
17 мая '16 в 14:27 2016-05-17 14:27 a resposta é dada por Erdem ÖZDEMİR 17 de maio de '16 às 14:27 2016-05-17 14:27

git checkout -f


man git-checkout :

-f, --force

Ao alternar ramificações, continue a trabalhar, mesmo se o índice ou a árvore de trabalho for diferente de HEAD. Isso é usado para remover alterações locais.

Ao verificar os caminhos do índice, não falhe em entradas não autorizadas; Em vez disso, as entradas ignoradas são ignoradas.

38
17 мая '14 в 5:28 2014-05-17 05:28 a resposta é dada Bijan 17 de maio de '14 às 5:28 2014-05-17 05:28

Você pode usar git stash - se algo der errado, você ainda pode retornar da sua carteira. Como outra resposta aqui, mas esta também exclui todos os arquivos desinstalados, bem como todas as exclusões desinstaladas:

 git add . git stash 

Se você verificar que está tudo bem, solte o cache:

 git stash drop 

A resposta de Bilal Maqsood usando git clean também funcionou para mim, mas com o aplicativo eu tenho mais controle - se eu acidentalmente fizer isso, ainda posso retornar minhas alterações

ATUALIZAÇÃO

Eu acho que há outra mudança (eu não sei porque funcionou para mim antes):

git add . -A git add . -A invés de git add .

sem -A arquivos excluídos não serão colocados

33
11 сент. A resposta é dada Asped 11 de setembro 2015-09-11 14:59 '15 às 14:59 2015-09-11 14:59

Em vez de descartar as alterações, redefini meu console para o começo. Nota Este método é projetado para restaurar totalmente sua pasta usando repo.

Portanto, faço isso para ter certeza de que eles não ficarão lá quando eu for reiniciado (mais tarde - exclui gitignores em Origem / nome do branch)

NOTA Se você quiser que os arquivos não sejam rastreados ainda, mas não no GITIGNORE, você pode pular esta etapa, pois isso destruirá esses arquivos não-fósseis não encontrados no repositório remoto (graças a @XtrmJosh).

 git add --all 

Então eu

 git fetch --all 

Então eu redefinir para o começo

 git reset --hard origin/branchname 

Isso irá devolvê-lo ao quadrado. Exatamente como RE-clonar um branch, enquanto salvando todos os meus arquivos gitignored localmente e no lugar.

Atualizado para comentário do usuário abaixo: Altere para redefinir para qualquer ramificação atual na qual o usuário está habilitado.

 git reset --hard @{u} 
31
08 авг. A resposta é dada por Nick 08 ago. 2015-08-08 00:15 '15 às 0:15 2015-08-08 00:15

Se você quiser apenas excluir as alterações nos arquivos existentes , use a checkout ( documentada aqui ).

 git checkout -- . 
  • Nenhuma ramificação é especificada, portanto, verifica a ramificação atual.
  • O hífen duplo ( -- ) diz ao Geeta que o seguinte deve ser seguido pelo seu segundo argumento (path), que você perdeu a especificação da ramificação.
  • Período ( . ) Indica todos os caminhos.

Se você quiser excluir arquivos adicionados desde o último commit, use clean ( documentado aqui ):

 git clean -i 
  • A -i inicia uma clean interativa para evitar exclusões errôneas.
  • Existem várias outras opções disponíveis para execução mais rápida; veja a documentação.

Se você quiser mover as alterações para o espaço de armazenamento para acesso posterior , use stash ( documentado aqui ):

 git stash 
  • Todas as alterações serão transferidas para o Git Stash para possível acesso subseqüente.
  • Várias opções estão disponíveis para um melhor armazenamento; veja a documentação.
25
18 марта '18 в 3:19 2018-03-18 03:19 Resposta é dada por jtheletter em 18 de março '18 às 3:19 2018-03-18 03:19

Eu tentei todas as soluções acima, mas ainda não consegui me livrar dos novos arquivos desinstalados.

Use git clean -f para remover esses novos arquivos - com cuidado! Preste atenção ao parâmetro de energia.

25
15 окт. Resposta dada por artur 15 de out 2011-10-15 00:07 '11 às 0:07 2011-10-15 00:07

apenas diga

 git stash 

Isso removerá todas as suas alterações locais. Você também pode usar mais tarde dizendo

 git stash apply 

ou git stash pop

20
24 апр. Resposta dada por piyushmandovra em 24 de abr 2015-04-24 15:19 '15 às 15:19 2015-04-24 15:19

Apenas use:

 git stash -u 

Está feito. Fácil

Se você realmente se importa com sua stack, você pode seguir com git stash drop . Mas neste momento você deve usar melhor (de Mariusz Nowak):

 git checkout -- . git clean -df 

No entanto, eu gosto do git stash -u melhor, porque ele "descarta" todas as alterações controladas e não testadas em apenas um comando. Ainda git checkout -- . apenas descarta as alterações controladas, e git clean -df apenas descarta as alterações git clean -df ... e a inserção dos dois comandos é muito trabalhosa :)

20
08 сент. Resposta dada por Ben Wilde 08 de setembro 2016-09-08 09:19 '16 às 9:19 2016-09-08 09:19

Até funciona em diretórios; fora das permissões normais do git.

 sudo chmod -R 664 ./*  git checkout -- .  git clean -dfx 

Aconteceu recentemente

16
05 сент. A resposta é dada por GlassGhost 05 de setembro 2013-09-05 12:38 '13 às 12:38 2013-09-05 12:38
 cd path_to_project_folder # take you to your project folder/working directory git checkout . # removes all unstaged changes in working directory 
14
30 мая '14 в 12:26 2014-05-30 12:26 a resposta é dada vivekporwal04 30 de maio de '14 às 12:26 2014-05-30 12:26

Não importa em que estado o seu repo está, você sempre pode redefinir todas as fixações anteriores:

 git reset --hard <commit hash> 

Isso desfará todas as alterações feitas após esse commit.

10
05 февр. a resposta é dada msangel 05 fev . 2016-02-05 03:59 '16 às 3:59 2016-02-05 03:59

Outra maneira de livrar-se de novos arquivos que são mais específicos que git clean -df (ele permitirá que você se livre de alguns arquivos não necessariamente todos) é primeiro adicionar novos arquivos ao índice, depois stash, depois o cache.

Esse método é útil quando, por alguma razão, você não pode excluir facilmente todos os arquivos brutos por algum mecanismo comum (por exemplo, rm).

10
15 июня '12 в 11:55 2012-06-15 11:55 a resposta é dada tjb 15 jun '12 at 11:55 2012-06-15 11:55

Na minha opinião

 git clean -df 

Tenho que fazer o truque. De acordo com a documentação git clean git

git -clean - remove arquivos não processados ​​da árvore de trabalho

Descrição

Limpa a árvore de trabalho excluindo recursivamente os arquivos que não estão sob controle de versão, começando com o diretório atual.

Normalmente, apenas os arquivos desconhecidos para o git são excluídos, mas se a opção -x for usada, os arquivos também serão ignorados. Isso pode, por exemplo, ser útil para remover todos os produtos de montagem.

Se algum argumento opcional for fornecido ... apenas esses caminhos serão afetados.

Opções

-d Exclui diretórios desnecessários, além dos arquivos sem rastreio. Se o diretório não assinado for gerenciado por outro repositório git, ele não será removido por padrão. Use a opção -f duas vezes, se você realmente quiser excluir esse diretório.

-f --force Se a variável de configuração git clean.requireForce não estiver definida como false, git clean recusará a inicialização se -f, -n ou -i não for especificado.

9
14 июля '16 в 10:03 2016-07-14 10:03 a resposta é dada Lahiru 14 de julho de '16 às 10:03 2016-07-14 10:03

O que segue é realmente apenas uma solução se você trabalhar com o plug-in do repositório, em que você sincroniza regularmente (por exemplo, uma solicitação de transferência) com outro repo. A resposta curta é: remova o fork e refork, mas leia os avisos do github .

Eu tive um problema semelhante, talvez não idêntico, e estou triste em dizer que a minha solução não é ideal, mas no final é eficaz.

Eu costumava ter mensagens de status do git assim (envolvendo pelo menos 2/4 arquivos):

 $ git status # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats # modified: doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats # modified: doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats 

O olhar atento vai notar que há dopplegangers nesses arquivos, que são a única letra no caso de off. De qualquer forma, e eu não tenho ideia do que me levou a esse caminho para iniciar (já que eu mesmo não trabalhei com esses arquivos do repositório upstream), troquei esses arquivos. Tente as muitas soluções listadas nesta página (e outras páginas) que não parecem ajudar.

Consegui corrigir o problema excluindo meu repositório ramificado e todos os repositórios locais e retornando novamente. Só isso não foi suficiente; upstream deveria ter renomeado os arquivos em questão em novos nomes de arquivos. Contanto que você não tenha nenhum trabalho quebrado, não há wiki e não há problemas que divergem do repositório, você deve estar bem. No mínimo, Upstream pode não estar muito satisfeito com você. Quanto ao meu problema, este é, sem dúvida, um erro do usuário, já que não tenho essa experiência com o git, mas o fato de que isso está longe de ser fácil de corrigir indica um problema com o git.

9
05 янв. A resposta é dada por bbarker 05 jan. 2014-01-05 07:53 '14 às 7:53 am 2014-01-05 07:53

Se você quiser transferir um cheque para outra pessoa:

 # add files git add . # diff all the changes to a file git diff --staged > ~/mijn-fix.diff # remove local changes git reset  git checkout . # (later you can re-apply the diff:) git apply ~/mijn-fix.diff 

[edit] como comentado, pode ser chamado de stashes. Bem, use isso se você quiser compartilhar sua carteira;)

7
08 июля '13 в 18:07 2013-07-08 18:07 a resposta é dada duas vezes em julho 08 '13 em 18:07 2013-07-08 18:07

Se todos os arquivos passo a passo foram realmente corrigidos, o ramo pode ser apenas um reset, por exemplo. da sua GUI com três cliques do mouse: Vetka , Reset , Yes !

Portanto, o que eu faço frequentemente na prática para desfazer alterações locais indesejadas é transferir todas as coisas boas e, em seguida, redefinir a ramificação.

Se as coisas boas forem corrigidas em um commit, então você pode usar "change last commit" para retorná-lo para a configuração ou instável se você quiser fazer um pouco diferente no final.

Isso pode não ser a solução técnica que você está procurando pelo seu problema, mas eu acho que é uma solução muito prática. Isso permite que você desfaça as alterações instáveis, redefina as alterações indesejadas e salve as alterações feitas.

Então eu acabei de confirmar , resetar o branch e mudar o último commit .

6
20 марта '15 в 18:38 2015-03-20 18:38 a resposta é dada por user3070485 março 20 '15 às 18:38 2015-03-20 18:38

Você pode criar seu próprio alias que descreve como fazer isso de maneira descritiva.

Eu uso o apelido a seguir para descartar as alterações.


Descartar alterações para (lista) arquivo (s) na árvore de trabalho

 discard = checkout -- 

Então você pode usá-lo para excluir todas as alterações:

 discard . 

Ou apenas um arquivo:

 discard filename 

Caso contrário, se você quiser desfazer todas as alterações, bem como os arquivos não utilizados, eu uso uma combinação de verificação e limpeza:

Limpar e descartar as alterações e não rastrear arquivos na árvore de trabalho

 cleanout = !git clean -df  git checkout -- . 

Portanto, o uso é simples:

 cleanout 

Agora disponível no seguinte repositório do Github, que contém muitos aliases:

5
05 июня '17 в 7:44 2017-06-05 07:44 Resposta é dada por Pau em 05 de junho '17 às 7:44 2017-06-05 07:44

Nenhuma das soluções funciona se você acabou de alterar as permissões de arquivo (isso é no DOS / Windoze)

 Seg 23/11/2015-15: 16: 34.80 C: \ ... \ work \ checkout \ slf4j +> git status Na ramificação SLF4J_1.5.3 Alterações não preparadas para confirmação:   (use "git add ..." para atualizar o que será confirmado)   (use "git checkout - ..." para descartar as alterações no diretório de trabalho) modificado: .gitignore modificado: LICENSE.txt modificado: TODO.txt modificado: codeStyle.xml modificado: pom.xml modificado: version.pl nenhuma alteração adicionada ao commit (use "git add" e / ou "git commit -a") Seg 23/11 / 2015-15: 16: 37.87 C: \ ... \ work \ checkout \ slf4j +> git diff diff --git a / .gitignore b / .gitignore modo antigo 100644 novo modo 100755 diff --git a / LICENSE.txt b / LICENSE.txt modo antigo 100644 novo modo 100755 diff --git a / TODO.txt b / TODO.txt modo antigo 100644 novo modo 100755 diff --git a / codeStyle.xml b / codeStyle.xml modo antigo 100644 novo modo 100755 diff --git a / pom.xml b / pom.xml modo antigo 100644 novo modo 100755 diff --git a / versão.pl b / versão.pl modo antigo 100644 novo modo 100755 Seg 23/11 / 2015-15: 16: 45.22 C: \ ... \ work \ checkout \ slf4j +> redefinição do git --hard HEAD HEAD está agora em 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Adicionado .gitignore Seg 23/11 / 2015-15: 16: 47.42 C: \ ... \ trabalho \ checkout \ slf4j +> git clean -f Seg 23/11 / 2015-15: 16: 53.49 C: \ ... \ work \ checkout \ slf4j +> git stash save -u Diretório de trabalho salvo e estado de índice WIP no SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore HEAD está agora em 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Adicionado .gitignore Seg 23/11 / 2015-15: 17: 00.40 C: \ ... \ work \ checkout \ slf4j +> git stash drop Apagados / escondidos @ {0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd) Seg 23/11/2015-15: 17: 06.75 C: \ ... \ work \ checkout \ slf4j +> git stash drop Apagados / esconderijos descartados @ {0} (e6c49c470f433ce344e305c5b778e810625d0529) Seg 23/11 / 2015-15: 17: 08.90 C: \ ... \ work \ checkout \ slf4j +> git stash drop Nenhum stash encontrado. Seg 23/11 / 2015-15: 17: 15.21 C: \ ... \ work \ checkout \ slf4j +> git checkout -. Seg 23/11/2015-15: 22: 00.68 C: \ ... \ work \ checkout \ slf4j +> git checkout -f -. Seg 23/11/2015-15: 22: 04.53 C: \ ... \ work \ checkout \ slf4j +> git status Na ramificação SLF4J_1.5.3 Alterações não preparadas para confirmação:   (use "git add ..." para atualizar o que será confirmado)   (use "git checkout - ..." para descartar as alterações no diretório de trabalho) modificado: .gitignore modificado: LICENSE.txt modificado: TODO.txt modificado: codeStyle.xml modificado: pom.xml modificado: version.pl nenhuma alteração adicionada ao commit (use "git add" e / ou "git commit -a") Seg 23/11/2015-15: 22: 13.06 C: \ ... \ work \ checkout \ slf4j +> git diff diff --git a / .gitignore b / .gitignore modo antigo 100644 novo modo 100755 diff --git a / LICENSE.txt b / LICENSE.txt modo antigo 100644 novo modo 100755 diff --git a / TODO.txt b / TODO.txt modo antigo 100644 novo modo 100755 diff --git a / codeStyle.xml b / codeStyle.xml modo antigo 100644 novo modo 100755 diff --git a / pom.xml b / pom.xml modo antigo 100644 novo modo 100755 diff --git a / versão.pl b / versão.pl modo antigo 100644 novo modo 100755

A única maneira de corrigir isso é redefinir manualmente as permissões nos arquivos modificados:

 Seg 23/11/2015-15: 25: 43.79 C: \ ... \ work \ checkout \ slf4j +> git status -s |  egrep "^ M" |  corte -c4- |  para / f "usebackq tokens = * delims ="% A em (`more`) faz chmod 644% ~ A Seg 23/11 / 2015-15: 25: 55.37 C: \ ... \ work \ checkout \ slf4j +> git status Na ramificação SLF4J_1.5.3 nada para cometer, diretório de trabalho limpo Seg 23/11/2015-15: 25: 59.28 C: \ ... \ work \ checkout \ slf4j +> Seg 23/11/2015-15: 26: 31.12 C: \ ... \ work \ checkout \ slf4j +> git diff
5
23 нояб. A resposta é dada por Malcolm Boekhoff, 23 de novembro. 2015-11-23 07:30 '15 às 7:30 2015-11-23 07:30

Se você estiver no caso de um submódulo e nenhuma outra solução funcionar, tente:

  • Para verificar qual é o problema (possivelmente o caso sujo), use:

    git diff

  • Para remover texto oculto

    git submodule update

5
02 окт. a resposta é dada onalbi 02 oct. 2015-10-02 00:32 '15 às 0:32 2015-10-02 00:32

Eu tive uma situação estranha quando o arquivo estava sempre faltando, isso me ajuda a resolver.

git rm.gitattributes
git add -A
git reset --hard

5
08 февр. A resposta é dada SDV 08 fev. 2017-02-08 14:58 '17 às 2:58 pm 2017-02-08 14:58
  • 1
  • 2

Outras questões sobre a tag ou Faça uma Pergunta