Git Reset
Última atualização
git reset move a branch atual para um commit diferente e, dependendo do modo, atualiza a área de stage (index) e a árvore de trabalho para corresponder. Os três modos diferem apenas em até onde essa atualização vai: --soft move a branch e para, --mixed (o padrão) também reseta a área de stage, e --hard também sobrescreve seus arquivos de trabalho.
Como --hard descarta o trabalho não commitado, saiba qual modo você quer antes de executá-lo. Experimente estes comandos com segurança no terminal playground: um shell real no seu navegador.
Os três modos
| Mode | Moves branch | Resets staging | Resets working tree |
|---|---|---|---|
--soft | Sim | Não | Não |
--mixed (default) | Sim | Sim | Não |
--hard | Sim | Sim | Sim |
Sintaxe
| Command | What it does |
|---|---|
git reset --soft HEAD~1 | Desfaz o último commit, mantém as mudanças no stage |
git reset HEAD~1 | Desfaz o último commit, mantém as mudanças fora do stage |
git reset --hard HEAD~1 | Desfaz o último commit, descarta as mudanças |
git reset <file> | Tira um arquivo do stage (mantém suas mudanças) |
git reset --hard origin/main | Força a branch local a corresponder à remota |
Casos comuns
| Goal | Command |
|---|---|
| Tirar tudo do stage | git reset |
| Tirar um arquivo do stage | git reset README.md |
| Voltar 3 commits, mantendo o trabalho | git reset --soft HEAD~3 |
| Descartar todas as mudanças locais desde um commit | git reset --hard <hash> |
Perguntas frequentes sobre git reset
Qual é a diferença entre --soft, --mixed e --hard?
Os três movem o ponteiro da sua branch para o commit de destino; eles diferem no que mais tocam.
--soft não muda mais nada, então suas mudanças continuam no stage. --mixed (o padrão) também limpa a área de stage, então as mudanças saem do stage mas continuam nos seus arquivos. --hard também sobrescreve sua árvore de trabalho para corresponder ao commit de destino, descartando as mudanças não commitadas.Como tiro um arquivo do stage com git reset?
Execute
git reset <file> (por exemplo git reset README.md), ou git reset sem caminho para tirar tudo do stage. Isso remove o arquivo da área de stage mas mantém suas edições na árvore de trabalho. Em versões mais novas do Git você também pode usar git restore --staged <file>, que faz a mesma coisa de forma mais explícita.O git reset --hard é reversível?
Não a partir da árvore de trabalho:
--hard descarta as mudanças não commitadas permanentemente. No entanto, o trabalho já commitado que você removeu com reset normalmente pode ser recuperado: execute git reflog para encontrar o hash do commit e depois git reset --hard <hash> (ou crie uma branch nele). Mudanças não commitadas que nunca foram para o stage nem commitadas não podem ser recuperadas, então use --hard com cuidado.Qual é a diferença entre git reset e git revert?
git reset reescreve o histórico movendo a branch para trás, o que é aceitável para commits locais, mas perigoso em commits que você já enviou. git revert mantém o histórico intacto e adiciona um novo commit que desfaz um anterior, sendo a escolha segura para branches compartilhadas.Posso praticar isso online?
Sim. Abra o terminal playground para executar
git reset em um shell real no seu navegador, sem precisar instalar nada. O curso interativo e gratuito de Git da Coddy também cobre como resetar e desfazer mudanças passo a passo.