6. Histórico

Resetando branches

Às vezes, você vai querer desfazer uma série de commits e fazer sua branch voltar a um estado anterior.

Digamos que eu estava experimentando algumas funcionalidades novas em uma branch, mas, depois de alguns commits, percebi que minha abordagem não está funcionando. Quero descartar todos esses commits experimentais e recomeçar do ponto em que a branch se separou da main.

O que fazer nesse caso?

É aí que o comando

entra em cena. Para simular esse cenário, primeiro vamos criar uma nova branch chamada experiment.

Executar no terminal:
git switch -c experiment
Tarefa
Concluída

Crie uma nova branch chamada experiment e troque para ela.

Ótimo! Agora, crie um arquivo experiment.html. Coloque a string This is an experiment. dentro dele, adicione ao stage e faça o commit das alterações.

Tarefa
Concluída

Faça tudo isso.

Excelente! Agora, remova a linha <!DOCTYPE html> do hello.html, adicione ao stage e faça o commit das alterações.

Tarefa
Concluída

Faça tudo isso.

Certo, digamos que a essa altura eu fiquei sóbrio percebi que esse experimento não está dando certo. Quero resetar a branch experiment para o estado inicial e descartar todos os commits experimentais.

Para isso, usamos o comando git reset seguido da referência ao commit ao qual queremos voltar. Aqui, queremos o commit a partir do qual a branch experiment foi criada. Em outras palavras, é o commit mais recente da branch main. Por isso, em vez de especificar um hash, podemos usar o nome da branch: main.

Executar no terminal:
git reset main
Tarefa
Concluída

Resete a branch experiment para o commit mais recente da main.

Se conferirmos o status do nosso repositório agora, vamos ver que o arquivo experiment.html ainda está lá, mas o Git o considera não rastreado. Isso significa que ele não está no stage nem em um commit.

Se você conferir o hello.html, também vai ver que o <!DOCTYPE html> está faltando. Ou seja, o diretório de trabalho continua igual e ainda contém nossas alterações experimentais.

Hmm... então o que mudou

O Git moveu o ponteiro da branch para o mesmo commit da branch main. Os commits que fizemos na branch experiment não fazem mais parte do histórico dela. Isso se chama reset mixed (misto): o histórico da branch volta atrás, mas as alterações continuam no diretório de trabalho e não estão mais no stage.

Se quisermos manter essas alterações, podemos simplesmente adicioná-las ao stage e commitá-las como de costume. Às vezes, é exatamente o que queremos. Isso serve, por exemplo, para dar squash em um zilhão de micro commits e transformá-los em um único commit significativo, ou para dividir todas as alterações de um commit gigante em vários subcommits.

Aqui, queremos nos livrar de todas as alterações experimentais, fazendo, na prática, um reset hard.

Queríamos mesmo resetar tudo!

Aliás, por que você não descarta agora mesmo as alterações do diretório de trabalho? Você pode usar o comando que aprendemos um tempo atrás (dica: ele começa com a letra r e, em inglês, rima com chore). Se você esqueceu o comando necessário, confira a .

Tarefa
Concluída

Descarte as alterações no diretório de trabalho.

Bom trabalho! Dava para fazer o reset hard em um único comando, adicionando a opção --hard ao git reset. Executar git reset --hard já me salvou de muita dor de cabeça no passado.

Vamos conferir o status do repositório agora.

Executar no terminal:
git status
Tarefa
Concluída

Confira o status do repositório.

As alterações no hello.html sumiram. Mas o arquivo experiment.html ainda está lá! Por quê?

Vamos entender o que aconteceu...

Como esse arquivo não é rastreado, o Git não sabe nada sobre ele. Ele não faz parte do repositório, então não é afetado pelo comando de reset. Se quisermos remover esse arquivo por completo, podemos simplesmente apagá-lo com o comando

.

Executar no terminal:
rm experiment.html
Tarefa
Concluída

Exclua o arquivo experiment.html.

Vamos conferir o status do repositório agora.

Executar no terminal:
git status
Tarefa
Concluída

Confira o status do repositório.

Ótimo! Nossa branch voltou ao estado em que estava quando a criamos.

Tarefa
Concluída

Antes de continuar, vamos trocar para a branch main.

Se você quiser manter as alterações dos commits descartados, pode usar git reset --soft em vez de git reset. Isso reseta o ponteiro da branch, mas mantém todas as alterações dos commits descartados na staging area.

Se você quiser remover completamente qualquer rastro dos commits descartados, pode usar git reset --hard. Isso reseta o ponteiro da branch e descarta todas as alterações no diretório de trabalho e na staging area. Use com cuidado extremo!

Cuidado ao usar git reset, principalmente com a opção --hard, porque ele pode descartar alterações de forma permanente. Antes de resetar, sempre confira se escolheu o commit certo. Se houver chance de precisar das alterações não commitadas mais tarde, guarde-as com git stash.

O comando git reset é um tanto parecido com o git restore, pelo menos no nome. Os dois podem ser usados para desfazer alterações no diretório de trabalho. Porém, o git restore é mais novo e faz menos coisas: ele pode restaurar arquivos no diretório de trabalho, mas não move o ponteiro da branch. Na verdade, foi por isso que esse comando foi criado: para separar o movimento do ponteiro da branch da restauração de arquivos. Ao usar o git restore, é menos provável que você quebre algo sem querer, porque ele é mais direcionado e menos destrutivo que o git reset.

Para quem está acostumado com o velho git reset, pode levar um tempo até se acostumar com o comando novo. Se você está começando no Git agora, vale entender a diferença e tentar usar o git restore em vez do git reset quando fizer sentido.

Next step
Quer testar o modo história?

Faça o curso do jeito que ele foi pensado: avance aos poucos, siga uma sequência linear, mantenha o foco e desbloqueie gradualmente as entradas da Gitopedia. Quando quiser, continue praticando com o Git de verdade no VS Code, Cursor ou Antigravity IDE.

Modo história
GRATUITO
mas precisa de login