Quando usar o Git Reset, o Git Revert e o Git Checkout

A caixa de ferramentas do Git fornece várias ferramentas exclusivas para corrigir erros durante o seu desenvolvimento. Comandos como git reset , git checkout e git revert permitem que você desfaça mudanças errôneas em seu repositório.

Porque eles executam operações semelhantes, é muito fácil misturá-los. Existem algumas diretrizes e regras para quando cada comando deve e não deve ser usado. Vamos dar uma olhada!

Seja cuidadoso! Você não pode sempre refazer depois de desfazer . Esta é uma das poucas áreas em Git onde você pode perder algum trabalho se fizer errado.

Desfazendo com comandos do Git

Vamos começar esclarecendo as principais diferenças entre esses três comandos.

Confira:

  • Use isso para mover o ponteiro HEAD para uma confirmação específica ou alternar entre as ramificações.
  • Ele reverte qualquer alteração de conteúdo para aqueles do commit específico.
  • Isso não fará alterações no histórico de confirmação.
  • Tem o potencial de sobrescrever arquivos no diretório de trabalho.

Reverter:

  • Alterações de reversão que você confirmou.
  • Cria um novo commit de um commit especificado, invertendo-o. Portanto, adiciona um novo histórico de confirmação ao projeto, mas não modifica o existente.
  • Tem o potencial de sobrescrever arquivos no diretório de trabalho.

Restabelecer:

  • Use isso para retornar a árvore de trabalho inteira ao último estado confirmado. Isso descartará os commits em uma agência privada ou jogará fora as alterações não confirmadas!
  • Alterações que comprometem uma ramificação que o HEAD está apontando atualmente. Altera o histórico de confirmação existente.
  • Pode ser usado para desassociar um arquivo.

Todo comando permite que você desfaça algum tipo de mudança em seu repositório, somente check-out e reset podem ser usados ??para manipular commits ou arquivos individuais.

Usando os Comandos

Há muitas maneiras diferentes de desfazer suas alterações , tudo depende do cenário atual. A seleção de um método apropriado depende se você cometeu ou não a alteração por engano e se você a confirmou, tenha compartilhado ou não.

Desfazer alterações públicas

Cenário: Imagem que você fez git push na ramificação do hotfix para os commits que você não queria fazer ainda.

Solução: A maneira mais segura de corrigir isso é revertendo suas alterações, pois não reescreve o histórico de confirmação.

 git checkout 
hotfix git revert HEAD~1

Resultado: Você desfez com sucesso alterações confirmadas! Tudo o que foi alterado no commit antigo será revertido com este novo commit. O Git obriga você a confirmar ou esconder quaisquer mudanças no diretório de trabalho que serão perdidas durante o checkout.

Você pode pensar em git revert como uma ferramenta para desfazer mudanças confirmadas , enquanto o git reset HEAD é para desfazer mudanças não confirmadas .

Desfazer alterações locais

Cenário: você começou a trabalhar em um recurso, mas não gostou do resultado final. Essas alterações não foram compartilhadas com mais ninguém.

Solução: Você deseja desfazer tudo nesse arquivo para o estado anterior, da mesma forma que aparentava no último commit .

 git checkout file_name.rb 

Resultado: O arquivo file_name.rb foi revertido para um estado conhecido anteriormente pelo Git. Observe que isso remove todas as alterações subseqüentes no arquivo!

Você pode usar git checkout branch_name para alternar entre filiais. O Git obriga você a confirmar ou esconder quaisquer mudanças no diretório de trabalho que serão perdidas durante a operação de checkout.

Desfazer alterações particulares

Cenário: Você fez alguns commits localmente no ramo de hotfix, mas tudo é terrível! Você deseja remover os dois últimos commits do branch atual.

Solução: Redefina o ramo de hotfix para trás por dois commits, como se esses commits nunca tivessem acontecido.

 git checkout hotfix 
git reset HEAD~2

Resultado: Nosso repositório git foi rebobinado todo o caminho de volta para o commit especificado. Aqueles que ficaram de fora agora são órfãos e serão removidos na próxima vez que o Git executar uma coleta de lixo . Por enquanto, o conteúdo deles ainda está no disco.

Você pode dizer ao Git o que fazer com seu índice (conjunto de arquivos que se tornará o próximo commit) e o diretório de trabalho ao executar o git reset usando um dos parâmetros:

  • --soft : Diz ao Git para redefinir o HEAD para outro commit, então o índice e o diretório de trabalho não serão alterados de forma alguma. Todos os arquivos alterados entre o HEAD original e o commit serão preparados.
  • --mixed : Assim como o soft, isso irá redefinir o HEAD para outro commit. Ele também redefinirá o índice para corresponder a ele enquanto o diretório de trabalho não será tocado. Todas as alterações permanecerão no diretório de trabalho e aparecerão como modificadas, mas não como encenadas.

A principal diferença entre --mixed e --soft é se o seu índice também é modificado ou não. Verifique mais no git-reset-guide .

  • --hard : Isso redefine tudo – redefine o HEAD de volta para outro commit, redefine o índice para corresponder a ele e redefine o diretório de trabalho para que ele também seja correspondido.

Dicas e truques

Eu cobrirei duas coisas adicionais que podem ser úteis durante suas aventuras no Git.

Corrigir a mensagem de confirmação anterior

Cenário: Todos cometem erros de digitação ao escrever commits e isso é completamente correto! Pode ser facilmente corrigido antes de você fazer um git push .

Solução: Apenas execute git commit --amend ou git commit --amend -m 'The new message' . Isso atualizará e substituirá o commit mais recente por um novo commit.

Refazer após desfazer

Cenário: Você fez uma git reset --hard para algumas alterações indesejadas, mas depois percebeu que realmente precisava delas.

Solução: git reflog vem em seu socorro! É um comando incrível para recuperar o histórico de projetos e recuperar quase tudo.

Espero que estas três ferramentas o ajudem sempre que você precisar desfazer suas alterações recentes.