Qual a diferença entre git reset e git revert?

O Git é uma das ferramentas de controle de versão mais populares e poderosas disponíveis para desenvolvedores. Duas das operações mais frequentemente discutidas e, às vezes, mal compreendidas no Git são git reset e git revert. Apesar de ambas estarem relacionadas à manipulação de commits, elas têm finalidades e comportamentos bastante distintos. Neste artigo, vamos explorar as diferenças entre esses dois comandos, quando usá-los e como eles funcionam.

O que é o git reset?

O comando git reset é utilizado para desfazer alterações no histórico de commits ou no estado da árvore de trabalho (working tree). Ele é um comando poderoso e pode impactar o repositório de várias maneiras, dependendo dos argumentos fornecidos. Em termos simples, o git reset permite que você mova a referência do HEAD (e possivelmente a do branch atual) para um commit específico.

Modos de operação do git reset

O git reset possui três modos principais:

  • –soft: Move o HEAD para o commit especificado, mas mantém os arquivos da área de staging (index) e da árvore de trabalho inalterados. As alterações dos commits removidos permanecem prontas para serem commitadas novamente.
  • –mixed (padrão): Move o HEAD para o commit especificado e desfaz as alterações na área de staging (index), mas deixa a árvore de trabalho intacta. As alterações se tornam “unstaged” e precisam ser adicionadas novamente com git add caso você queira fazer um novo commit.
  • –hard: Move o HEAD para o commit especificado, desfazendo completamente as alterações tanto na área de staging quanto na árvore de trabalho. Esse modo pode ser destrutivo, pois elimina as alterações não commitadas.

Exemplo de uso do git reset

Imagine que você fez dois commits consecutivos, mas percebeu que o segundo commit contém erros. Para voltar ao estado do primeiro commit, você pode usar:

git reset --hard HEAD~1

Esse comando move o HEAD para o commit anterior e desfaz todas as alterações introduzidas no commit mais recente.

O que é o git revert?

O comando git revert é usado para criar um novo commit que reverte as alterações introduzidas por um commit anterior. Em vez de apagar ou modificar o histórico, como o git reset, o git revert preserva a integridade do histórico do repositório, tornando-o ideal para repositórios compartilhados ou colaborativos.

Como o git revert funciona?

O git revert cria um commit que aplica o inverso das alterações feitas por um commit específico. Isso significa que as alterações introduzidas pelo commit alvo são desfeitas, mas o histórico permanece intacto e linear.

Exemplo de uso do git revert

Se você deseja reverter o commit mais recente, pode usar:

git revert HEAD

Esse comando gera um novo commit que desfaz as alterações introduzidas pelo commit identificado como HEAD (o commit mais recente). O Git abrirá o editor padrão para que você insira uma mensagem para o novo commit de reversão.

Principais diferenças entre git reset e git revert

Aqui está uma visão geral das principais diferenças entre esses dois comandos:

Aspecto git reset git revert
Impacto no histórico Modifica o histórico de commits (pode ser destrutivo). Preserva o histórico, adicionando um novo commit de reversão.
Uso em repositórios compartilhados Não recomendado, pois pode causar conflitos para outros desenvolvedores. Recomendado, pois mantém a integridade do histórico.
Finalidade Desfaz commits e altera o estado da árvore de trabalho. Desfaz alterações de commits específicos sem alterar a árvore de trabalho diretamente.
Modos de operação --soft, --mixed, --hard. Sem modos específicos; cria sempre um novo commit de reversão.
Facilidade de recuperação Alterações podem ser irreversíveis, dependendo do modo. As alterações podem ser recuperadas ao reverter o commit de reversão.

Quando usar git reset?

O git reset é mais apropriado em cenários locais, onde você tem certeza de que ninguém mais está trabalhando no mesmo branch. Ele é útil quando você deseja corrigir rapidamente erros em commits recentes ou redefinir o estado do repositório antes de compartilhar seu trabalho.

Alguns exemplos de casos de uso:

  • Remover commits locais que ainda não foram enviados para o repositório remoto.
  • Desfazer rapidamente alterações na área de staging.
  • Redefinir completamente o estado da árvore de trabalho (usando --hard).

Quando usar git revert?

O git revert é mais apropriado para cenários colaborativos, onde o histórico do repositório precisa permanecer intacto. Ele é ideal para desfazer alterações sem afetar o trabalho de outros desenvolvedores ou comprometer o histórico do repositório.

Alguns exemplos de casos de uso:

  • Desfazer commits em um repositório compartilhado.
  • Reverter alterações específicas sem impactar outros commits.
  • Preservar um histórico auditável e confiável.

Cuidados ao usar git reset e git revert

Ambos os comandos exigem cuidado ao serem usados. Aqui estão algumas dicas para garantir que você os utilize corretamente:

  • Antes de usar git reset --hard, sempre confirme se você não perderá alterações importantes. Use git stash para salvar mudanças temporárias, se necessário.
  • Evite usar git reset em commits que já foram enviados para o repositório remoto.
  • Ao usar git revert, revise o commit alvo para garantir que ele seja o que você realmente deseja reverter.

Conclusão

O git reset e o git revert são ferramentas poderosas no arsenal do Git, cada uma com seu propósito e aplicação. O git reset é ideal para manipulação local e rápida do histórico, enquanto o git revert é a escolha preferida para desfazer alterações em repositórios colaborativos. Compreender as diferenças entre esses dois comandos e usá-los corretamente pode ajudá-lo a evitar erros e melhorar a produtividade em seus projetos.

Esperamos que este guia tenha ajudado você a entender melhor as diferenças entre git reset e git revert. Agora você pode escolher a abordagem certa para cada situação com confiança!