Redefinir todas as alterações após a última confirmação no git

324

Como posso desfazer todas as alterações feitas no meu diretório após a última confirmação, incluindo excluir arquivos adicionados, redefinir arquivos modificados e adicionar novamente arquivos excluídos?

Dogbert
fonte
possível duplicata de Reverter para Git commit anterior
Nawfal
8
@nawfal pode ser uma duplicata, mas 'redefinir todas as alterações após o último commit' corresponde a mais critérios de pesquisa (palavras pesquisadas no google) do que o correspondente 'como reverter o repositório git'. Pelo menos para pessoas como eu que não têm Inglês como língua materna: d
Shirish Herwade

Respostas:

561

Redefina primeiro as alterações

git reset HEAD --hard

depois limpe tudo não rastreado. Se você deseja manter os arquivos que não são rastreados .gitignore, tenha cuidado com este comando.

git clean -fd
Benjamin Bannier
fonte
7
@ Adam: Às vezes, você também pode querer a -xopção git clean, que o direciona para remover arquivos ignorados também.
Cascabel
31
Se você deseja manter os arquivos que não são rastreados devido ao .gitignore, tenha cuidado com o git clean -fdcomando
bitsoflogic 23/09/14
3
@ Levinaris: É o contrário git clean -fdque não exclui arquivos ignorados. -xvai.
Robert Siemer
5
@RobertSiemer Na verdade, pode! Se você tiver alguma pasta composta inteiramente de arquivos ignorados, ela removerá essas pastas, excluindo os arquivos ignorados. Considere um arquivo .gitignore como esse aqui: stackoverflow.com/q/25554504/456645 . Neste exemplo, suponha que algumas pastas não tenham arquivos PHP. git clean -fdexcluirá essas pastas e arquivos não rastreados. Testado com a versão 1.9.1 do git
bitsoflogic
3
mas por que a segunda 'limpeza' é necessária?
Shirish Herwade
71

Como posso desfazer todas as alterações feitas no meu diretório após a última confirmação, incluindo excluir arquivos adicionados, redefinir arquivos modificados e adicionar novamente arquivos excluídos?

  1. Você pode desfazer alterações nos arquivos rastreados com:

    git reset HEAD --hard
    
  2. Você pode remover arquivos não rastreados com:

    git clean -f
    
  3. Você pode remover arquivos e diretórios não rastreados com:

    git clean -fd
    

    mas você não pode desfazer a alteração para arquivos não rastreados .

  4. Você pode remover arquivos e diretórios ignorados e não rastreados

    git clean -fdx
    

    mas você não pode desfazer a alteração para arquivos ignorados .

Você também pode definir clean.requireForcepara false:

git config --global --add clean.requireForce false

para evitar usar -f( --force) quando você usa git clean.

Ortomala Lokni
fonte
2
Impressionante, exatamente o que eu precisava. Obrigado pela comparação de todos os comandos relevantes!
Marquee
-1

Existem dois comandos que funcionarão nessa situação,

root> git reset --hard HEAD ~ 1

root> git push -f

Para mais comandos git, consulte esta página

RKS
fonte
1
git push -fnão está relacionado à pergunta e, nesse cenário, é perigoso
bigode1up