Reverter para o último git commit

120

Eu acabei de fazer um

git commit -m "blah"

em seguida, adicionei alguns arquivos, como faço para reverter e remover o que está em meus arquivos atuais que ainda não foram adicionados / confirmados?

Blankman
fonte
15
não, isso não é o que o OP está pedindo - está claro que ele deseja reverter para o último commit, não desfazer o último commit. ele não disse que adicionou alguns arquivos e depois os enviou. tão claramente ele quer o último commit.
Paul,
1
É muito difícil encontrar uma resposta para esta pergunta super comum
Sam

Respostas:

211

Caveat Emptor - Comandos destrutivos à frente.

Mitigação - git reflog pode salvá-lo se precisar.


1) DESFAZER alterações de arquivos locais e MANTER seu último commit

git reset --hard

2) DESFAZER alterações de arquivos locais e REMOVER seu último commit

git reset --hard HEAD^

3) MANTER as alterações do arquivo local e REMOVER seu último commit

git reset --soft HEAD^
Joe Hanink
fonte
20
Este comando irá deletar seu commit anterior, então use com cuidado! git reset --hard is mais seguro
rudivonstaden
9
WTF está fazendo isso como a resposta correta com 36 votos a favor. Acabei de perder alguns dias de trabalho para isso ... porque li a resposta não o comentário. Esta não é a resposta correta para a pergunta!
Chris Nevill
1
OK, nem tudo está perdido! Você pode fazer git reflog, isso permitirá que você veja os commits que você fez antes do reset. Você pode então verificar esses commits
Chris Nevill
3
Pelo que vale a pena, eu tinha interpretado a pergunta do OP como "como faço para reverter o commit e remover os arquivos atuais", mas era e continua sendo ambígua. Eu teria entendido de forma diferente se o OP tivesse simplesmente dito "como faço para remover os arquivos atuais que não foram adicionados ou confirmados"
Joe Hanink
2
Git é a antítese da declaração de Alan Kays. Coisas simples deveriam ser simples, coisas complexas deveriam ser possíveis. ... especialmente de sua primeira parte. Mesmo assim, obrigado por sua resposta. ajudou.
0xC0000022L
46

Se você deseja remover conteúdos e arquivos recém-adicionados que já foram testados (adicionados ao índice), use:

git reset --hard

Se você deseja remover também o seu último commit (aquele com a mensagem "blá"), é melhor usar:

git reset --hard HEAD^

Para remover os arquivos não rastreados (para que novos arquivos ainda não tenham sido adicionados ao índice) e as pastas, use:

git clean --force -d
Paul Pladijs
fonte
git reset --hard HEAD ^ remove meu último commit permanentemente? como se eu não pudesse voltar para isso?
user137717
parece que "git clean --force -d" também remove as pastas .gitignored
Alexey Timokhin
15

git reset --hard forçará o diretório de trabalho de volta ao último commit e excluirá os arquivos novos / alterados.

SpliFF
fonte
2
fez isso, mas os arquivos ainda estão lá. (os arquivos não rastreados ainda estão lá)
Blankman
neste caso, você poderia fazer um "git stash"
jacktrade de
3
votado positivamente porque esta é a única resposta clara e inequívoca à pergunta clara e inequívoca do OP.
Paulo
4

Você pode reverter um commit usando git revert HEAD^para reverter para o penúltimo commit. Você também pode especificar o commit para reverter usando o id em vez de HEAD ^

Sebastian oliva
fonte
Isso não "reverte" no sentido que você está dizendo. Isso cria uma confirmação reversa.
Stefan Kendall
4

Se você deseja apenas descomprimir o último commit, use isto:

git reset HEAD~

funciona como charme para mim.

Abhishek Saharn
fonte
2
esta é a resposta exata para a pergunta
Deniz Kocaboğa
esta deve ser a resposta aprovada
amiabl
3

Uma maneira fácil e infalível de UNDO alterações de arquivos locais desde o último commit é colocá-los em um novo branch:

git branch changes
git checkout changes
git add .
git commit

Isso deixa as mudanças no novo ramo. Retorne ao branch original para encontrá-lo de volta ao último commit:

git checkout master

O novo branch é um bom lugar para praticar diferentes maneiras de reverter as alterações sem risco de bagunçar o branch original.

Terje Norderhaug
fonte