Como reverter alterações não confirmadas, incluindo arquivos e pastas?


1071

Existe um comando git para reverter todas as alterações não confirmadas em uma árvore e índice de trabalho e também remover arquivos e pastas recém-criados?



1
Bem, li todas as respostas variadas e difíceis de lembrar abaixo, com suas ressalvas e casos extremos e "não funcionou se você tiver xxx", e continuei excluindo todo o repo, clonando-o para remover todos os arquivos editados e adicionados . Também é apenas dois comandos. rm -r projectdir; clone git xxx. Para mim, essa é uma operação frequente - confira um repo play, depois queira voltar para um checkout limpo para que eu possa começar a modificá-lo. Não é ótimo, mas funciona 100%. Esperando que um dia eles adicionem um comando simples para isso.
John pouco

Respostas:


1771

Você pode executar estes dois comandos:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
É uma boa idéia executar o 'git clean -nd' para visualizar as alterações antes de executar o git clean para garantir que você não tenha arquivos ou diretórios não rastreados que sejam importantes e que sejam removidos.
jpw

79
Salvar alguém uma viagem para os docs: -f é a força, -d é diretórios remover, -n é corrida seca (também --dry-run; show de saída sem fazer nada até o momento)
Aaron Campbell

12
git clean -ipara um modo interativo.
galath

Ele não redefiniu meus arquivos não organizados, tive que prepará-los primeiro.
Aron Lorincz

4
@IgorGanapolsky Você provavelmente está no meio de um conflito de mesclagem. Tente correr git merge --abort.
htanata

555

Se você deseja reverter as alterações apenas no diretório de trabalho atual, use

git checkout -- .

E antes disso, você pode listar os arquivos que serão revertidos sem realmente executar nenhuma ação, apenas para verificar o que acontecerá, com:

git checkout --

1
Quando tento isso, recebo "error: pathspec '.' não encontrou nenhum arquivo conhecido por git #
Mike K

34
qual é a diferença entre this e git reset --hard?
Felipe Almeida

104
'git reset --hard' desfará as alterações em etapas e em etapas, enquanto 'git checkout -.' irá desfazer alterações só unstaged
divideByZero

Mas se você usar check-out e você tem arquivos modificados, o cmd retornará que eu preciso fazer a fusão, mesmo quando eu só preciso reverter estas mudanças
Vinicius Monteiro

7
git checkout - simplesmente lista os arquivos que serão revertidos (nenhuma ação, basta listar). isso é útil se você quiser ver quais arquivos serão afetados antes de fazer o git checkout -.
Krish Srinivasan

107

Use "git checkout - ..." para descartar as alterações no diretório de trabalho

git checkout -- app/views/posts/index.html.erb

ou

git checkout -- *

remove todas as alterações feitas em arquivos não estágios no status git, por exemplo

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

5
git checkout -- *não funciona para mim, a menos que eu esteja no diretório em que os arquivos alterados estão localizados. Para a verificação de todos os arquivos em toda a todo o repositório, você deve fazergit checkout -- :/
waldyrious

Em git checkout -- *, a estrela é substituída pelo Shell, com todos os arquivos e diretórios no diretório atual. Portanto, deve ir em subdiretórios. Funciona para mim. Mas, graças a destacar a sintaxe ": /" que parece mais limpa na minha opinião.
Mvcive #

53

Uma maneira não trivial é executar estes dois comandos:

  1. git stash Isso moverá suas alterações para o stash, levando você de volta ao estado de HEAD
  2. git stash drop Isso excluirá o último stash criado no último comando.

3
Isso não funciona para alterações não confirmadas, apenas alterações confirmadas.
b0xxed1n

4
Eu o usei para alterações não confirmadas e funciona.
Paul D. Eden

7
@ b0xxed1n O armazenamento em cache é sobre alterações não confirmadas e, obviamente, funciona para elas.
TJ

O git stash foi feito para salvar as alterações não confirmadas para que você pudesse .. salvá-las sem confirmar.
Rob

git stash resulta no seguinte erro:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky

19
git clean -fd

não ajudou, novos arquivos permaneceram. O que eu fiz foi excluir totalmente toda a árvore de trabalho e depois

git reset --hard

Consulte " Como limpo meu diretório de trabalho local no git? " Para obter conselhos para adicionar a -xopção de limpeza:

git clean -fdx

O -x sinalizador de nota removerá todos os arquivos ignorados pelo Git, portanto, tenha cuidado (consulte a discussão na resposta à qual me refiro).


o que é -fdx? "força, diretório
ex

O sinalizador @AdiPrasetyo -x também remove todos os arquivos ignorados; pode ser um efeito indesejado, por isso atualizei minha resposta.
Fr0sT

Ainda não consigo me recuperar. Eu recebo o erro: error: Falha ao mesclar as alterações. O patch falhou em 0003 Criar a chamada de volta para A cópia do patch que falhou foi encontrada em:
IgorGanapolsky

13

Eu acho que você pode usar o seguinte comando: git reset --hard


hhmm ... Eu fiz isso, mas meus arquivos ainda estão lá. Devo fazer alguma coisa depois?
MEM

1
O git reset apenas reverte as alterações não confirmadas na árvore de trabalho. Não removerá os novos arquivos e pastas. Não estou certo como fazer isso com git
Josnidhin

1
Portanto, se alterarmos um diretório do sistema adicionando novos arquivos e pastas, e desejamos reverter esse diretório para um estado anterior (sem esses arquivos e pastas), não podemos fazer isso com o git? Então, o melhor que podemos é reverter os estados dos arquivos? Mas uma vez que criamos um arquivo, não podemos removê-lo, a menos que o façamos manualmente?
MEM

6

Observe que ainda pode haver arquivos que parecem não desaparecer - eles podem não ter sido editados, mas o git pode tê-los marcado como editados devido a alterações no CRLF / LF. Veja se você fez algumas alterações .gitattributesrecentemente.

No meu caso, adicionei configurações de CRLF ao .gitattributesarquivo e todos os arquivos permaneceram na lista "arquivos modificados" por causa disso. Alterar as configurações de .gitattributes os fez desaparecer.


6

Se você tiver uma alteração não confirmada (apenas na sua cópia de trabalho) que deseja reverter para a cópia em sua confirmação mais recente, faça o seguinte:

git checkout filename

Estou tentando isso depois de um não confirmado git rm filename, e não está funcionando. error: pathspec 'filename' did not match any file(s) known to git.
falsePockets

A solução para desfazer git rmégit checkout master -- filename
falsePockets

3

O Git 2.23 introduziu o git restorecomando para restaurar os arquivos da árvore de trabalho.

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

Para restaurar todos os arquivos no diretório atual

restauração git.

Se você deseja restaurar todos os arquivos de origem C para corresponder à versão no índice, é possível fazer

git restore '* .c'


1
é git 2.23 , não 2.13
phuclv

2

Você pode apenas usar o seguinte comando git, que pode reverter todas as alterações não confirmadas feitas no seu repositório:

git checkout .

Exemplo:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

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:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

Eu costumo usar desta maneira que funciona bem:

mv fold/file /tmp
git checkout fold/file

É exatamente o mesmo que o cara com 357 "gostos" propôs. Somente você cria um backup do arquivo recém-retirado.
Matthias

-3

Um caminho seguro e longo:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

-3

Usar:

git reset HEAD filepath

Por exemplo:

git reset HEAD om211/src/META-INF/persistence.xml
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.