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?


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^

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

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.


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 ^


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.


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.

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.