Gostaria de remover todas as alterações na minha cópia de trabalho.
A execução git status
mostra arquivos modificados.
Nada do que faço parece remover essas modificações.
Por exemplo:
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout -- Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout `git ls-files -m`
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git reset --hard HEAD
HEAD is now at 6c857e7 boo libraries updated to 2.0.9.2 and rhino.dsl.dll updated.
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
git
revert
git-status
working-copy
rbellamy
fonte
fonte
git reset --hard
não funcionou aqui. Nota: deve sergit checkout -- `git ls-files -m`
para cancelar os arquivos (--
)checkout -- <file>
los, deve funcionar. A detecção de mudanças é um picky pouco em algumas situações (entre outros, se CRLF incompatibilidade está presente)git update-index --assume-unchaged
(!, mesmo para os mais alterados) forças do estado unchaged dos arquivosRespostas:
Existem vários problemas que podem causar esse comportamento:
Normalização de final de linha
Eu também tive esse tipo de problema. Tudo se resume ao git convertendo automaticamente crlf para lf. Isso geralmente é causado por terminações de linhas mistas em um único arquivo. O arquivo é normalizado no índice, mas quando o git o desnormaliza novamente para diferenciá-lo do arquivo na árvore de trabalho, o resultado é diferente.
Mas se você quiser corrigir isso, desative core.autocrlf , altere todas as terminações de linha para lf e ative-o novamente. Ou você pode desativá-lo completamente fazendo:
Em vez de core.autocrlf , você também pode considerar o uso de
.gitattribute
arquivos. Dessa forma, você pode garantir que todos que usam o repositório usem as mesmas regras de normalização, impedindo que as terminações de linhas mistas entrem no repositório.Considere também configurar core.safecrlf para avisar se você deseja que o git avise quando uma normalização não reversível seria executada.
As páginas de manual do git dizem o seguinte:
Sistemas de arquivos que não diferenciam maiúsculas de minúsculas
Nos sistemas de arquivos que não diferenciam maiúsculas de minúsculas, quando o mesmo nome de arquivo com caixa diferente está no repositório, o git tenta fazer check-out dos dois, mas apenas um acaba no sistema de arquivos. Quando o git tenta comparar o segundo, ele o compara ao arquivo errado.
A solução seria mudar para um sistema de arquivos que não diferencia maiúsculas de minúsculas, mas na maioria dos casos isso não é viável ou renomeia e confirma um dos arquivos em outro sistema de arquivos.
fonte
git ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -d
. Para listar os nomes maiúsculas e minúsculas de tais arquivos executargit ls-tree -r --name-only HEAD | fgrep -i -f <(git ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -d) | sort -i
Eu estava tendo esse problema no Windows, mas não estava preparado para analisar as implicações do uso
config --global core.autocrlf false
. Também não estava preparado para abandonar outras ramificações e itens particulares no meu estoque e começar com um novo clone. Eu só preciso fazer algo. Agora.Isso funcionou para mim, com a idéia de permitir que o git reescreva seu diretório de trabalho completamente:
(Observe que a execução
git reset --hard
não era boa o suficiente nem era clarorm
nos arquivos antes doreset
que são sugeridos nos comentários da pergunta original)fonte
core.autocrlf
não teve nenhum efeito.core.autocrlf false
. Essa resposta funcionou quando nada mais funcionaria.Outra solução que pode funcionar para as pessoas, pois nenhuma das opções de texto funcionou para mim:
.gitattributes
uma única linha:* binary
. Isso diz ao git para tratar cada arquivo como um arquivo binário com o qual ele não pode fazer nada.git checkout -- <files>
restaure-os na versão do repositóriogit checkout -- .gitattributes
restaurar o.gitattributes
arquivo ao seu estado inicialfonte
.gitattributes
voltar ao original reintroduziria o mesmo problema, mas, infelizmente, meu problema está resolvido. Nenhuma das outras sugestões funcionou no meu caso.git status
, descobre que são arquivos diferentes. Quando você perguntagit checkout
, descobre que eles têm o mesmo conteúdo. Essa solução está instruindo temporariamente o git a ignorar qualquer inteligência possível de final de linha e garantir que sua cópia local seja byte por byte idêntica à deHEAD
. Uma vez que isso tenha sido resolvido, não há problema em permitir a retomada da inteligência, pois não adicionará novos erros.Para futuras pessoas com esse problema: As alterações no modo de arquivo também podem ter os mesmos sintomas.
git config core.filemode false
vai consertar isso.fonte
git checkout .
git diff
e ele mostrará arquivos com alterações de modo como estaold mode 100755 / new mode 100644
.Isso está me deixando louco, especialmente porque eu não poderia consertar isso sem nenhuma das soluções encontradas online. Aqui está como eu resolvi isso. Não posso aceitar os créditos aqui, pois esse é o trabalho de um colega :)
Origem do problema: Minha instalação inicial do git foi sem conversão automática de linha no Windows. Isso fez com que meu commit inicial no GLFW estivesse sem o final da linha adequada.
Configuração: repo Git do Xubuntu 12.04 com projeto glfw
Problema: Não foi possível redefinir os arquivos glfw. Eles sempre aparecem como modificados, independentemente do que eu tentei.
Resolvido:
fonte
Eu tinha um arquivo .bat com o mesmo problema (não conseguia se livrar dele em arquivos não rastreados). git checkout - não funcionou, nem nenhuma das sugestões nesta página. A única coisa que funcionou para mim foi fazer:
E então para excluir o esconderijo:
fonte
--keep-index
é importante.Tem o mesmo problema duas vezes! Nas duas vezes em que escondi algumas alterações, fiz e tentei devolvê-las. Não foi possível exibir as alterações, pois tenho muitos arquivos alterados - mas eles NÃO são! Eles são exatamente os mesmos.
Agora acho que tentei todas as soluções acima sem sucesso. Depois de tentar o
Agora eu tenho quase todos os arquivos no meu repositório modificados.
Ao diferenciar o arquivo, ele exclui todas as linhas e as adiciona novamente.
Meio perturbador. Agora vou evitar esconder no futuro ..
A única solução é clonar um novo repositório e começar de novo. (Feito da última vez)
fonte
Tente fazer um
Isso deve limpar todas as alterações no repositório local de trabalho atual
fonte
git checkout -f <another recent branch>
voltar ao meu ramo comgit checkout -f <branch I'm working on>
Eu só consegui consertar isso excluindo temporariamente o arquivo .gitattributes do meu repositório (que definiu
* text=auto
e*.c text
).Corri
git status
após a exclusão e as modificações foram encerradas. Eles não retornaram nem mesmo depois que o .gitattributes foi restaurado.fonte
Ter finais de linha consistentes é uma coisa boa. Por exemplo, ele não acionará mesclagens desnecessárias, embora triviais. Vi o Visual Studio criar arquivos com terminações de linhas mistas.
Também alguns programas como o bash (no linux) exigem que os arquivos .sh sejam finalizados por LF.
Para garantir que isso aconteça, você pode usar gitattributes. Ele funciona no nível do repositório, independentemente do valor do autcrlf.
Por exemplo, você pode ter .gitattributes como este: * text = auto
Você também pode ser mais específico por tipo / extensão de arquivo, se isso importa no seu caso.
O autocrlf pode converter localizações finais de linha para programas do Windows localmente.
Em um projeto misto de C # / C ++ / Java / Ruby / R, Windows / Linux, isso está funcionando bem. Sem problemas até agora.
fonte
Eu também tive os mesmos sintomas, mas foi causado por algo diferente.
Eu não era capaz de:
mesmo que
git rm --cached app.js
ele assine como excluído e em arquivos não rastreados eu pude ver o app.js. Mas quando eu tenteirm -rf app.js
realizargit status
novamente, ele ainda me mostra o arquivo em 'não rastreado'.Após algumas tentativas com o colega, descobrimos que isso foi causado pelo Grunt!
Como o
Grunt
foi ativado e porque o app.js foi gerado a partir de outros arquivos js, descobrimos que, após cada operação com arquivos js (também este app.js), o grunhido recria o app.js novamente.fonte
Esse problema também pode ocorrer quando um colaborador do repositório trabalha em uma máquina Linux ou as janelas com Cygwin e as permissões de arquivo são alteradas. O Git conhece apenas 755 e 644.
Exemplo deste problema e como verificar:
Para evitar isso, certifique-se de configurar o git corretamente usando
fonte
Existem muitas soluções aqui e talvez eu devesse ter tentado algumas delas antes de criar as minhas. Enfim, aqui está mais um ...
Nosso problema foi que não tínhamos aplicação para linhas finais e o repositório tinha uma mistura de DOS / Unix. Pior ainda era que era realmente um repositório de código aberto nessa posição e que tínhamos bifurcado. A decisão foi tomada por aqueles com propriedade primária do repositório do SO para alterar todas as linhas finais para o Unix e a confirmação foi feita, incluindo um
.gitattributes
para aplicar as terminações de linha.Infelizmente, isso pareceu causar problemas semelhantes aos descritos aqui, onde, uma vez que uma mesclagem de código anterior ao DOS-2-Unix era feita, os arquivos seriam marcados para sempre como alterados e não podiam ser revertidos.
Durante minha pesquisa para isso, me deparei com - https://help.github.com/articles/dealing-with-line-endings/ - Se eu enfrentar esse problema novamente, começaria tentando isso.
Aqui está o que eu fiz:
Inicialmente, fiz uma mesclagem antes de perceber que tinha esse problema e tive que anular isso -
git reset --hard HEAD
( encontrei um conflito de mesclagem. Como posso anular a mesclagem? )Abri os arquivos em questão no VIM e mudei para Unix (
:set ff=unix
). Uma ferramenta comodos2unix
poderia ser usada em vez de, é clarocomprometido
mesclou o
master
in (o mestre tem as alterações do DOS-2-Unix)git checkout old-code-branch; git merge master
Os conflitos resolvidos e os arquivos eram do DOS novamente, assim como
:set ff=unix
no VIM. (Observe que instalei https://github.com/itchyny/lightline.vim, o que me permitiu ver qual é o formato do arquivo na linha de status do VIM)fonte
O problema que encontrei é que o Windows não se importa com a capitalização de nomes de arquivos, mas o git. Então o git armazenou uma versão em maiúsculas e minúsculas do arquivo, mas só pôde fazer o checkout de uma.
fonte
Confirmei todas as alterações, depois fiz e desfarei no commit. Isso funcionou para mim
git add.
git commit -m "Envio aleatório"
git reset --hard HEAD ~ 1
fonte
Normalmente, no GIT para limpar todas as suas modificações e novos arquivos, os 2 comandos a seguir devem funcionar muito bem (tenha cuidado , isso excluirá todos os novos arquivos + pastas que você pode ter criado e restaurará todos os arquivos modificados para o estado atual confirmar ):
Talvez uma opção melhor às vezes seja apenas "git stash push" com mensagem opcional, da seguinte forma:
Isso também limpará todos os seus arquivos novos e modificados, mas você terá todos eles armazenados, caso deseje restaurá-los. O stash no GIT é transportado de ramificação em ramificação, para que você possa restaurá-los em uma ramificação diferente, se desejar.
Como uma observação lateral, caso você já tenha preparado alguns arquivos adicionados recentemente e queira se livrar deles, isso deve fazer o truque:
Se todas as opções acima não funcionarem para você , leia abaixo o que funcionou para mim há um tempo:
Eu já tive esse problema algumas vezes antes. Atualmente, estou desenvolvendo na máquina Windows 10 fornecida pelo meu empregador. Hoje, esse comportamento git específico foi causado por eu criar um novo ramo do meu ramo "desenvolver". Por alguma razão, depois que voltei para a ramificação "develop", alguns arquivos aparentemente aleatórios persistiram e estavam aparecendo como "modificados" no "status git".
Além disso, naquele momento, eu não podia fazer check-out de outro ramo, então fiquei preso no meu ramo "desenvolver".
Isto é o que eu fiz:
Percebi que o novo ramo que criei do "develop" hoje mais cedo estava aparecendo na primeira mensagem "commit", sendo referenciado no final "HEAD -> desenvolver, originar / desenvolver, origem / HEAD, The-branch-i-created -hoje mais cedo ".
Como eu realmente não precisava, eu a apaguei:
Os arquivos alterados ainda estavam aparecendo, então eu fiz:
Isso resolveu meu problema:
É claro
$ git stash list
que mostrarei alterações ocultas e, como eu tinha poucas e não precisava de nenhuma das minhas ocultas, fiz$ git stash clear
para EXCLUIR TODAS AS IMPOSTAS.NOTA : Não tentei fazer o que alguém sugeriu aqui antes de mim:
Isso pode ter funcionado também, tentarei na próxima vez em que encontrar esse problema.
fonte
Se você clonar um repositório e vir instantaneamente as alterações pendentes, o repositório estará em um estado inconsistente. Por favor, NÃO comente
* text=auto
do.gitattributes
arquivo. Isso foi colocado lá especificamente porque o proprietário do repositório deseja que todos os arquivos sejam armazenados de forma consistente com as terminações de linha LF.Conforme declarado pelo HankCa, seguir as instruções em https://help.github.com/articles/dealing-with-line-endings/ é o caminho a seguir para corrigir o problema. Botão fácil:
Em seguida, mescle (ou solicite pull) a ramificação ao proprietário do repositório.
fonte
Nada mais nesta página funcionou. Isso finalmente funcionou para mim. Mostrando arquivos não rastreados ou confirmados.
fonte
Para mim, o problema era que o Visual Studio foi aberto ao executar o comando
git checkout <file>
Depois de fechar o Visual Studio, o comando funcionou e eu finalmente pude aplicar meu trabalho da pilha. Portanto, verifique todos os aplicativos que possam fazer alterações no seu código, por exemplo, SourceTree, SmartGit, NotePad, NotePad ++ e outros editores.
fonte
Enfrentamos uma situação semelhante em nossa empresa. Nenhum dos métodos propostos não nos ajudou. Como resultado da pesquisa, o problema foi revelado. O fato era que no Git havia dois arquivos, cujos nomes diferiam apenas no registro de símbolos. Os sistemas Unix os viam como dois arquivos diferentes, mas o Windows estava ficando louco. Para resolver o problema, excluímos um dos arquivos no servidor. Depois disso, nos repositórios locais do Windows ajudaram os próximos comandos (em diferentes seqüências):
fonte
Eu o resolvi editando .git / config, adicionando:
Depois fui para .git / refs / heads / name_branch e coloquei o ID do último commit
enter code here
fonte
Eu resolvi assim:
Foi o que funcionou para mim.
fonte
Uma solução proposta aqui não funcionou, descobri que o arquivo era realmente um link para alguns caracteres especiais:
fonte