git desfaz todas as alterações não confirmadas ou não confirmadas


834

Estou tentando desfazer todas as alterações desde o meu último commit. Eu tentei git reset --harde git reset --hard HEADdepois de ver este post . Eu respondo com a cabeça agora em 18c3773 ... mas quando olho para a minha fonte local, todos os arquivos ainda estão lá. o que estou perdendo?


1
Este é um grande recurso em linha reta do Github: Como desfazer (quase) qualquer coisa com Git
jasonleonhard

Fácil de entender e simples de ler: git-scm.com/book/en/v2/Git-Basics-Undoing-Things
MyTitle

Respostas:


1620
  • Isso desestabilizará todos os arquivos com os quais você pode ter preparado git add:

    git reset
    
  • Isso reverterá todas as alterações não confirmadas locais (devem ser executadas no repo root):

    git checkout .
    

    Você também pode reverter as alterações não confirmadas apenas para um arquivo ou diretório específico:

    git checkout [some_dir|file.txt]
    

    Ainda outra maneira de reverter todas as alterações não confirmadas (mais para digitar, mas funciona em qualquer subdiretório):

    git reset --hard HEAD
    
  • Isso removerá todos os arquivos não rastreados locais, portanto, apenas os arquivos rastreados pelo git permanecem:

    git clean -fdx
    

    AVISO: -x também removerá todos os arquivos ignorados, incluindo os especificados por .gitignore! Você pode usar -npara visualizar os arquivos a serem excluídos.


Para resumir: a execução de comandos abaixo é basicamente equivalente a nova git clonefonte original (mas não faz o download novamente, é muito mais rápido):

git reset
git checkout .
git clean -fdx

O uso típico para isso seria nos scripts de construção, quando você deve garantir que sua árvore esteja absolutamente limpa - não possui modificações ou arquivos de objetos criados localmente ou cria artefatos, e você deseja fazê-la funcionar muito rápido e não clonar repositório inteiro toda vez.


@turibe isso mesmo. Eu tive que iniciar meu projeto várias vezes porque estava removendo todas as dependências baixadas e minha pasta .idea. Precisa de uma solução melhor.
EresDev

2
@EresDev, você não precisa executar git clean, ele desfaz alterações não confirmadas, mas mantém todos os arquivos não rastreados ou adicionados. Porém, isso pode afetar o resultado da compilação porque alguns arquivos não rastreados podem estar interferindo. Por exemplo, e se o diretório .idea estiver corrompido?
mvp

git resetme diz que tenho mudanças eu preciso para salvar
Daniel Springer

1
executando git clean -fdxexcluiu meu node_modulese .env, ótimo
fires3as0n 12/02

1
@ fires3as0n O que mais você esperava? Isso estava prestes a acontecer. Há um aviso na resposta também.
Rishav 20/02

148

Se você deseja " desfazer " todas as alterações não confirmadas, execute:

git stash
git stash drop

Se você tiver arquivos não rastreados (verifique executando git status), eles podem ser removidos executando:

git clean -fdx

git stashcria um novo stash que se tornará stash @ {0} . Se você deseja verificar primeiro, pode correr git stash listpara ver uma lista dos seus esconderijos. Será algo como:

stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
stash@{1}: WIP on master: 2b8f269 Map qualifications
stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
stash@{3}: WIP on blogit: c9bd270 some changes

Cada stash é nomeado após a mensagem de confirmação anterior.


2
Uma boa solução, mas na verdade você precisa estágio alterações usando git add .antes git stashporque ele estava me mostrando mudanças uncommited mesmo depoisgit stash
EresDev


12

Estou usando a árvore de origem .... Você pode reverter todas as alterações não confirmadas com 2 etapas fáceis:

1) basta redefinir o status do arquivo da área de trabalho

insira a descrição da imagem aqui 2) selecione todos os arquivos de estágio (comando + a), clique com o botão direito do mouse e selecione remover

insira a descrição da imagem aqui

É simples assim: D


Se você redefinir e alterar a ramificação e rebase na ramificação redefinida, isso será prejudicial. A redefinição é útil, mas não deve ser usada para eliminar alterações não confirmadas. No caso de descartar alterações não confirmadas, apenas esconda e solte o esconderijo.
Dinu Nicolae

10

O que eu faço é

git add . (adding everything)
git stash 
git stash drop

Um forro: git add . && git stash && git stash drop


este é o melhor
Madrugada

7

Para quem chegou aqui procurando se poderia desfazer git clean -f -d, pelo qual um arquivo criado no eclipse foi excluído,

Você pode fazer o mesmo na interface do usuário usando "restaurar a partir do histórico local" para ref: Restaurar a partir do histórico local


3
Eu não votei no entanto, sua resposta é menos que clara sobre sua intenção; ajudaria se você reformulasse a primeira frase da resposta.
Mark Schultheiss

5

Estados em transição de um commit para um novo commit

0. last commit,i.e. HEAD commit
1. Working tree changes, file/directory deletion,adding,modification.
2. The changes are staged in index
3. Staged changes are committed

Ação para transição de estado

0->1: manual file/directory operation
1->2: git add .
2->3: git commit -m "xxx"

Check diff

0->1: git diff
0->2: git diff --cached
0->1, and 0->2: git diff HEAD
last last commit->last commit: git diff HEAD^ HEAD

Reverter para a última confirmação

2->1: git reset
1->0: git checkout .     #only for tracked files/directories(actions include modifying/deleting tracked files/directories)
1->0: git clean -fdx     #only for untracked files/directories(action includes adding new files/directories)
2->1, and 1->0: git reset --hard HEAD

Equivalente ao clone git, sem baixar novamente nada

git reset && git checkout . && git clean -fdx

Não vejo como isso se relaciona com a pergunta. Esta é apenas uma série de receitas estranhas, sem qualquer substância real.
mvp 10/05
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.