Resetando branches
Às vezes você pode querer desfazer uma série de commits e devolver sua branch 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.
É aí que o comando entra em cena. Para simular esse cenário, primeiro vamos criar uma nova branch chamada experiment.
git switch -c experimentCrie 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.
Realize todas as ações acima.
Excelente! Agora, remova a linha <!DOCTYPE html> do hello.html, adicione ao stage e faça o commit das alterações.
Realize todas as ações acima.
Certo, digamos que neste ponto 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, podemos usar o comando git reset seguido da referência ao commit para o qual queremos resetar. Neste caso, queremos voltar ao commit a partir do qual a branch experiment foi criada. Em outras palavras, é o commit mais recente da branch main. Então, em vez de especificar um hash de commit, podemos usar o nome da branch para a qual queremos resetar: main.
git reset mainResete 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 não mudou de verdade. Ele ainda contém nossas alterações experimentais.
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 isso que você quer fazer. Por exemplo, se quiséssemos dar squash em um zilhão de micro commits para transformá-los em um único commit significativo, ou quando queremos dividir todas as alterações de um commit gigante em vários subcommits etc.
Neste caso, queremos nos livrar de todas as alterações experimentais, fazendo, na prática, um reset hard.
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 .
Descarte as alterações no diretório de trabalho.
Bom trabalho! Na verdade, poderíamos ter feito o reset hard em um único comando, adicionando a opção --hard ao comando 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.
git statusConfira o status do repositório.
As alterações no hello.html sumiram. Mas o arquivo experiment.html ainda está lá! Por quê?
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 .
rm experiment.htmlExclua o arquivo experiment.html.
Vamos conferir o status do repositório agora.
git statusConfira o status do repositório.
Ótimo! Nossa branch voltou ao estado em que estava quando a criamos.
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!
Tenha cuidado ao usar git reset, principalmente com a opção --hard, porque ele pode descartar alterações de forma permanente. Sempre confira duas vezes se você está resetando para o commit certo. Se você achar que vai precisar das alterações não commitadas mais tarde, guarde essas alterações com git stash antes de resetar.
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.
Porém, para quem está acostumado com o velho git reset, pode levar um tempo até se acostumar com o comando novo. Mas, 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.
Faça o curso do jeito que ele foi pensado: progressão em pequenas doses, ordem linear e focada, desbloqueio gradual das entradas da Gitopedia. Continue com o Git de verdade no VS Code/Cursor/Antigravity/Windsurf a qualquer momento.
mas precisa de login