Ione Souza Junior

Git Reset e Git Revert: Gerenciando Erros no Git

22/03/2024 | 6 minutos de leitura | Tradu√ß√Ķes: en | #git

Na jornada do desenvolvimento de software, os erros s√£o inevit√°veis. Seja uma linha de c√≥digo mal posicionada ou um commit equivocado, todo desenvolvedor j√° enfrentou a sensa√ß√£o angustiante que acompanha um erro em seu trabalho. No entanto, no mundo dos sistemas de controle de vers√£o, como o Git, esses passos em falso n√£o precisam significar um desastre. Git reset e Git revert servem como far√≥is de esperan√ßa em meio ao mar tumultuado de mudan√ßas de c√≥digo, oferecendo aos desenvolvedores os meios para corrigir erros, retroceder em decis√Ķes equivocadas e direcionar seus projetos de volta ao curso correto. Neste post, vamos explorar as nuances do Git reset e Git revert, descobrindo suas capacidades e nos armando com o conhecimento necess√°rio para navegar pelas √°guas agitadas do controle de vers√£o com confian√ßa. Ent√£o, vamos mergulhar e descobrir como Git reset e Git revert podem ser nossos companheiros firmes na busca por c√≥digo impec√°vel e colabora√ß√£o perfeita.

Compreendendo o git reset

Git reset √© um comando vers√°til que permite aos desenvolvedores manipular o estado da √°rea de prepara√ß√£o (staging) e diret√≥rio de trabalho do seu reposit√≥rio. Em sua ess√™ncia, Git reset serve como uma ferramenta para desfazer altera√ß√Ķes e redefinir o HEAD atual para um estado especificado. No entanto, sua funcionalidade se estende muito al√©m do mero desfazer, oferecendo aos desenvolvedores uma variedade de op√ß√Ķes para navegar pela hist√≥ria de seus projetos e gerenciar a progress√£o dos commits.

Uma das fun√ß√Ķes principais do Git reset √© mover o ponteiro HEAD para um commit diferente, efetivamente redefinindo o estado do reposit√≥rio para aquela snapshot espec√≠fica no tempo. Esta a√ß√£o pode ser realizada com v√°rios graus de granularidade, permitindo que os desenvolvedores redefinam o HEAD para um commit espec√≠fico, branch, ou at√© mesmo para um estado anterior do diret√≥rio de trabalho. Vamos ver o comando e suas principais varia√ß√Ķes.

Movendo HEAD para um commit específico

Git reset move o ponteiro HEAD para o commit especificado, redefinindo a √°rea de prepara√ß√£o e o diret√≥rio de trabalho para corresponder ao estado desse commit. As altera√ß√Ķes feitas ap√≥s este commit ser√£o removidas da √°rea de prepara√ß√£o. Todos os arquivos que voc√™ alterou entre o ponteiro que voc√™ move e o ponteiro que estava antes sair√£o da √°rea de prepara√ß√£o.

git reset <commit-hash>

Soft reset

Soft reset move o ponteiro HEAD para o commit especificado enquanto preserva as altera√ß√Ķes na √°rea de prepara√ß√£o. Isso permite que voc√™ fa√ßa novamente o commit das altera√ß√Ķes ou fa√ßa modifica√ß√Ķes adicionais antes de realizar o commit.

git reset --soft <commit-hash>

Hard reset

Um hard reset move o ponteiro HEAD para o commit especificado e redefine tanto a √°rea de prepara√ß√£o quanto o diret√≥rio de trabalho para corresponder ao commit. Todas as altera√ß√Ķes feitas ap√≥s este commit ser√£o descartadas permanentemente.

git reset --hard <commit-hash>

Hard reset com HEAD como argumento descarta todas as altera√ß√Ķes locais e redefine o diret√≥rio de trabalho para corresponder ao commit atual. Isso √© √ļtil para reverter para um estado limpo sem preservar quaisquer modifica√ß√Ķes.

git reset --hard HEAD

Removendo altera√ß√Ķes da √°rea de prepara√ß√£o

Suponha que voc√™ j√° colocou algumas altera√ß√Ķes na √°rea de prepara√ß√£o e deseja mov√™-las para a √°rea de trabalho. O seguinte comando remove o arquivo especificado da √°rea de prepara√ß√£o enquanto preserva as altera√ß√Ķes no diret√≥rio de trabalho.

git reset HEAD <arquivo>

Também é possível omitir o nome do arquivo para aplicar o comando a todos os arquivos na área de preparação.

Compreendendo o git revert

Enquanto git reset modifica o hist√≥rico de commits movendo o HEAD e as refer√™ncias de branch para um commit espec√≠fico, git revert adota uma abordagem diferente. Em vez de alterar o hist√≥rico de commit, git revert cria um novo commit que desfaz as altera√ß√Ķes introduzidas por um commit especificado.

git revert <commit-hash>

Quando voc√™ executa o comando acima, o Git criar√° um novo commit que aplica inversamente as altera√ß√Ķes feitas por um commit especificado. Isso efetivamente desfaz as altera√ß√Ķes introduzidas por esse commit sem alterar o hist√≥rico de commits. √Č importante observar que git revert opera no diret√≥rio de trabalho e na √°rea de prepara√ß√£o, criando um novo commit com altera√ß√Ķes que revertem aquelas introduzidas por um commit especificado.

Por exemplo, suponha que voc√™ tenha um commit com hash ‚Äúabc123‚ÄĚ que introduziu um bug, e voc√™ deseja desfazer as altera√ß√Ķes introduzidas por esse commit. Voc√™ pode usar git revert abc123 para criar um novo commit que desfaz as altera√ß√Ķes feitas por ‚Äúabc123‚ÄĚ, efetivamente corrigindo o bug sem alterar o hist√≥rico de commit.

Ao contr√°rio de git reset, que pode ser usado para retroceder o hist√≥rico de commit, git revert √© mais adequado para desfazer commits espec√≠ficos enquanto preserva a integridade do hist√≥rico de commits. √Č uma op√ß√£o mais segura ao trabalhar em reposit√≥rios compartilhados ou quando voc√™ precisa manter um hist√≥rico de commit limpo e linear.

Você pode reverter mais de um commit por vez.

git revert <commit-hash-1> <commit-hash-2>

Ou reverter um intervalo de commits, do mais antigo para o mais recente.

git revert <oldest-commit-hash> <newest-commit-hash>

Git reset vs. git revert: escolhendo a ferramenta certa

Para aqueles que preferem recursos visuais, aqui est√° uma tabela destacando as principais distin√ß√Ķes entre os comandos.

Recurso git reset git revert
Operação Reescreve o histórico de commits Cria um novo commit com as mudanças revertidas
Efeito no hist√≥rico Retrocede para um commit espec√≠fico Reverte as altera√ß√Ķes do commit especificado
Hash do commit Move o HEAD e a refer√™ncia de branch Cria um novo commit com as altera√ß√Ķes revertidas
Colaboração Pode ser disruptivo em repositórios compartilhados Seguro para repositórios compartilhados, preserva o histórico
Caso de uso Desfazer altera√ß√Ķes locais ou preparar para recommit Reverter altera√ß√Ķes no hist√≥rico compartilhado
Perda de hist√≥rico Pode resultar na perda de altera√ß√Ķes que n√£o possuem commit Preserva o hist√≥rico de commit, cria um novo commit de revers√£o

Aproveitando os poderes de desfazer do Git

No mundo do desenvolvimento de software, erros s√£o inevit√°veis, mas n√£o precisam ser permanentes. Com os poderosos comandos ‚Äúreset‚ÄĚ e ‚Äúrevert‚ÄĚ do Git √† sua disposi√ß√£o, voc√™ det√©m as chaves para gerenciar erros e navegar pela hist√≥ria do seu projeto com confian√ßa. Ao entender as nuances de cada comando e aplicar as melhores pr√°ticas, voc√™ pode utilizar as capacidades de viagem no tempo do Git a seu favor, garantindo um processo de desenvolvimento mais suave e eficiente. Portanto, abrace o poder do Git, aprenda com seus erros e continue sua jornada rumo a se tornar um guru do Git.