Não consigo descartar alterações no Git

124

Depois de ver o seguinte na linha de comando:

# On branch RB_3.0.10
# 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:   index.htm

Estou tentando descartar minhas alterações digitando o comando:

git checkout -- index.htm

mas quando eu executo o status do git, ele parece exatamente o mesmo. O check-out não parece estar funcionando. Estou fazendo algo errado? Estou usando o GIT 1.6.1.2 no windows / cygwin.

# On branch RB_3.0.10
# 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:   index.htm
Eyal
fonte
4
Does git checkout HEAD -- index.htm(check-out do último estado comprometido, em vez de check-out do índice) as obras?
Jakub Narębski 16/10/09
3
git checkout HEAD -- index.htmtrabalhou para mim!
precisa

Respostas:

52

Isso está me incomodando há um tempo, quase todos os repositórios que eu conferia tinham alterações que não podia descartar. Para encurtar a história, tentei todas as opções acima, nada funcionou. Foi o que fiz para voltar ao normal (em um Mac):

Completely remove the autocrlf & safecrlf settings from ~/.gitconfig
Completely remove the autocrlf & safecrlf settings from your repo's local config ./.git/config
git rm --cached -r .
git reset --hard
Frank Martin
fonte
7
Depois de tentar tudo acima, esta foi a única coisa que funcionou para mim (no Windows)
Anders
Obrigado! Assim como Anders disse, esta solução também está funcionando para mim. Troquei autocrlf com # autocrlf
David
37

Aqui está minha experiência, defina as seguintes variáveis ​​em .git/config:

[core]
    autocrlf = false
    safecrlf = false
    eol = crlf

depois corra $ git checkout HEAD .e funcione. mas $ git checkout -- .não estranho!

* git versão 1.9.3

Nianliang
fonte
35

Quais alterações são git diffexibidas no arquivo? No Windows, vi problemas com terminações de linhas causando problemas como este. Nesse caso, veja quais configurações você possui git config core.autocrlfe git config core.safecrlf. Há alguma documentação para essas configurações aqui .

Eu diria que, se você estiver usando git svnpara integração com o subversion, verifique se autocrlfestá desativado. Pelo que posso dizer, está quebrado nesta configuração e faz com que a maioria das ferramentas pense que os arquivos foram alterados quando você faz um checkoutpara reverter as alterações.

Se você estiver vendo um problema em que está git checkout, e git statusmostrar que o arquivo ainda está modificado, e git diffmostra que o arquivo foi modificado em todas as linhas do arquivo, esse é o problema que está ocorrendo.

core.autocrlf

Se verdadeiro, faz com que o git converta CRLF no final das linhas em arquivos de texto em LF ao ler no sistema de arquivos, e faça inversão ao escrever no sistema de arquivos. A variável pode ser configurada para entrada; nesse caso, a conversão ocorre apenas durante a leitura do sistema de arquivos, mas os arquivos são gravados com LF no final das linhas. Atualmente, quais caminhos considerar "texto" (ou seja, estar sujeito ao mecanismo autocrlf) são decididos puramente com base no conteúdo.

core.safecrlf

Se verdadeiro, o git verifica se a conversão de CRLF controlada por core.autocrlf é reversível. O Git verificará se um comando modifica um arquivo na árvore de trabalho, direta ou indiretamente. Por exemplo, confirmar um arquivo seguido pelo check-out do mesmo arquivo deve render o arquivo original na árvore de trabalho. Se esse não for o caso da configuração atual do core.autocrlf, o git rejeitará o arquivo. A variável pode ser configurada como "warn", caso em que o git avisará apenas sobre uma conversão irreversível, mas continuará a operação. ...

1800 INFORMAÇÃO
fonte
core.autocrlf = true core.safecrlf não foi definido. Isso deve ser definido como verdadeiro para o Windows? Qual a diferença entre os dois?
Eu diria, deixe os dois desligados se você estiver usando o git svn. Eu adicionei mais alguns detalhes.
1800 INFORMAÇÃO
4
Eu estou supondo que ele significa girando-o em pelo menos 90 graus
vijrox
2
Quando defino core.autocrlf e core.safecrlf como true, pude descartar as alterações detectadas nos arquivos incorretos executando 'git reset --hard HEAD'.
Aleksey 30/01
19

Eu acho que você precisa passar -f

Na página do manual ( man git-checkout, GIT-CHECKOUT (1)):

-f, --force
Prossiga mesmo que o índice ou a árvore de trabalho seja diferente de HEAD.
Isso é usado para jogar fora as alterações locais .

Por exemplo, descarte as alterações na ramificação atual e alterne para uma ramificação diferente:

git checkout -f master
hasen
fonte
7
Passe -f para o que? Seria bom para fazer a resposta completa
PandaWood
@ Matt minha intenção não era fazer checkout de um ramo diferente. A resposta é a partir de 2009, então eu realmente não me lembro, mas a julgar pela pergunta, eu acho que eu quis passar -fpara check-out - <filename> como emgit checkout -f -- filename
Hasen
@hasen Os três comentários que você pediu foram esclarecidos, e foi por isso que adicionei o "por exemplo". O exemplo não exclui outros usos de-f
Matt H #:
Trabalhou para mim. git checkout -f masterjogou "Já está no 'mestre'", mas as mudanças se foram.
Christian
11

Podem ser finais de linha, como o @ 1800-information sugere, mas outra possibilidade é que a diferença (que está impedindo a reversão desses arquivos com um comando de checkout) é do modo de arquivo. Isto é o que aconteceu comigo. Na minha versão do git, você pode descobrir isso usando

git diff index.htm

E mostrará as alterações no modo de arquivo. No entanto, ele ainda não permitirá que você os reverta usando o checkout, mesmo com a opção -f. Para esse uso, quer

git config core.filemode false

ou altere seu git .config no seu editor de texto adicionando

[testemunho]

filemode = false

Depois de fazer isso, você pode usar

git reset HEAD index.htm

e o arquivo deve desaparecer.

(Entendi tudo isso com as respostas para Como faço para o git ignorar as alterações do modo (chmod)? E atualizar as permissões de arquivo apenas no git )

Eyal
fonte
6

Você está no OSX ou no Windows? Nesse caso, o problema provavelmente está em ter dois arquivos com o mesmo nome, em maiúsculas e minúsculas. por exemplo. index.htm e Index.htm

O Windows e, por padrão, o OSX, usa um sistema de arquivos que não diferencia maiúsculas de minúsculas, que entra em conflito com o git que diferencia maiúsculas de minúsculas.

Fil
fonte
2

Eu tive esse problema e depois de tentar todas as opções acima, nada funcionou.

O que funcionou para mim foi excluir o diretório em que o arquivo estava e, em seguida, fez git statuse certificou-se de que todos os arquivos nesse diretório agora estejam marcados como excluídos. Depois disso, simplesmente fiz git checkout -fe tudo voltou ao normal.

Eldar
fonte
1

Eu estava trabalhando em um libGDXprojeto Android Studioe queria descartar todas as alterações que fiz e nada funcionou para mim. A solução que surgiu foi a de comprometer todas as alterações em uma nova ramificação.

git checkout -b TRASH
git add .
git commit -m "discarded changes"
git checkout master

e então você pode excluir a TRASHramificação, se desejar.

Waqleh
fonte
1

Eu tive o mesmo problema, nada dos comentários acima funcionou. Acontece que o meu sistema de arquivos não diferencia maiúsculas de minúsculas (padrão osx, mas o Windows provavelmente se comporta da mesma forma) e um arquivo estava presente com maiúsculas e minúsculas no mesmo diretório, com conteúdo diferente. Como no meu computador os dois nomes apontavam para o mesmo arquivo, o status git sempre mostrava uma modificação, não importa o que eu fiz. Para resolver o problema:

  • Eu tive que remover um dos arquivos de outro computador e empurrá-lo para repo

  • exclua toda a versão local completamente

  • git clone do zero

Joe
fonte
0

Eu tive um problema semelhante, no qual não me permitia descartar arquivos que não existem ou foram alterados. Uso o Visual Studio no trabalho e descobri que isso acontece ao alternar ramificações enquanto o aplicativo está em execução.

git checkoute tentar descartar não ajudou. Não funcionaria ou apenas me diria que não tenho permissão.

Solução que funcionou:

  1. Entre no modo de segurança
  2. Descartar arquivos

Reiniciar é uma dor, mas isso funcionou mais rápido do que tentar 100 coisas.

Gene Parcellano
fonte
0

Existe uma solução fácil. Se isso acontecer (normalmente devido ao desligamento inesperado do Windows ou ao despejo de memória) e você não puder descartar suas alterações e nem alternar entre ramificações (o Git diz que você não tem permissão suficiente); no Windowsambiente a show all hidden files and folderspartir das opções de pasta. Vá para o diretório GIT (deve começar .git) e exclua o "index.lock"arquivo. Então o Git deve permitir que você faça o que quiser.

Mahib
fonte
0

Acabei fazendo um git stashseguido de um git stash cleanpara me livrar de alguns. Não encontrou nenhuma configuração automática de cr / lf no arquivo .git / ou ~ / .git.

Matt H
fonte
0

No meu caso, não pude descartar as alterações relacionadas a um diretório. por exemplo, quando eu executei um diff do git, eu veria isso: -Subproject commit fdcccccccccccccccccccccccccccccccccccccc +Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

Então eu chamei esse diretório e executei um status git lá. Estava em um estado desconectado HEAD. E então eu apenas corri um git checkout masterlá. Isso acertou as coisas para mim. Mas isso não é útil para o cenário exato solicitado aqui.

Sheetal Kaul
fonte
0

Esta é uma pergunta antiga, mas ainda era relevante para mim. Não encontrei minha resposta até perguntar pelo escritório e descobri que o problema estava nos submódulos. Quando elas são atualizadas, e seu próprio repositório não reflete essas alterações, ele aparece como tendo diferenças, redefinir a cabeça não ajuda. Se for esse o caso, execute:

git status update

Isso deve ajudar a consertar as coisas (nesse caso em particular)

Bradley Robinson
fonte
0

Eu tive um problema de permissões no Windows e tive que fazer icacls containingFolder /reset /t /l /ce clique duas vezes na pasta para recuperar minhas permissões.

Noumenon
fonte
0

Eu tinha .gitattributes com o seguinte conteúdo:

* text=auto eol=lf

Para solucionar o problema, edite .gitattributespara remover esta linha que relaxa as terminações da linha. Em seguida, git reset --hard HEADreverti os arquivos e o .gitattributesarquivo.

James Jithin
fonte
0

Para mim, esse problema surgiu com a combinação do download de uma imagem Git-LFS que foi carregada via Netlify CMS e servida de maneira diferente pelo manipulador Netlify Large Media.

Minha solução foi comentar / remover essas linhas da minha ~/.gitconfigpara que elas se pareçam abaixo e depois verificando git statusnovamente.

# [filter "lfs"]
#   clean = git-lfs clean %f
#   smudge = git-lfs smudge %f
#   required = true

OU você provavelmente pode adicionar um filtro mais local através de um .gitconfigna raiz de repositório e de alguma forma substituir as regras de filtro para lfs lá.

Espero que isso ajude um colega.

Knogobert
fonte
-1

Também enfrentei um problema semelhante e os seguintes passos me ajudaram:

git commit -am 'temp commit'
git pull origin master
git reset head~1
git reset head --hard

Espero que ajude outras pessoas também.

Atin Agarwal
fonte