Programa
Podemos comprometer um aplicativo mesclando códigos problemáticos, seja por integrar acidentalmente um trabalho inacabado à ramificação principal ou por ignorar um bug crítico que passou pelos testes automatizados.
Neste artigo, orientarei você no processo de uso do git revert para desfazer uma mesclagem com segurança, garantindo que o histórico de confirmações permaneça intacto e que a integridade do projeto seja preservada.
Torne-se um engenheiro de dados
Como git revert Trabalhos
Podemos pensar em git revert como a versão do Git de um comando de desfazer. No entanto, o comando git revert não exclui commits nem salta para um estado anterior do ramo. Em vez disso, ele cria um novo commit que reverte as alterações de um commit específico.

A sintaxe para reverter um commit com o hash é:
git revert <commit_hash>
Podemos listar os commits juntamente com seus identificadores de hash usando o comando git log. A saída de git log lista os commits do mais recente para o mais antigo, da seguinte forma:

Por exemplo, para reverter o commit que implementa a função subtrair, usaríamos o comando:
git revert 7ba24a3e62d4d37182428ccfaa070baa222b1151
Usando o git revert, podemos desfazer as alterações de um commit específico sem afetar o histórico de commits.
Observe que o git revert não é mágico e, dependendo do histórico de confirmações, pode resultar em um conflito que precisa ser resolvido manualmente.
Vantagens de git revert Sobre alterações manuais
Por que o git revert é útil se talvez seja necessário resolver um conflito manualmente? Não seria mais fácil desfazer as alterações manualmente? Vamos ver suas vantagens:
- Preserva o histórico:
git revertcria um novo commit que desfaz as alterações de um commit especificado, preservando todo o histórico do commit. Isso ajuda a manter um histórico transparente de alterações e reversões. - Inversão atômica: Isso garante que as reversões sejam atômicas e consistentes. Quando excluímos e confirmamos alterações manualmente, há o risco de erro humano.
- Conscientização sobre conflitos: Isso garante que sejamos alertados por meio de conflitos se houver alguma integração ou alteração que dependa do commit original. Isso pode parecer inconveniente, mas protege contra efeitos colaterais indesejados.
- Metadata: O novo commit criado pelo git revert inclui metadados e uma mensagem de commit que descreve contextualmente o que foi revertido, auxiliando na compreensão futura. Sem o site
git revert, esse contexto pode ser perdido.
Reverter uma mesclagem em diferentes cenários
Nesta seção, aprenderemos como desfazer uma mesclagem. Para fins de exemplo, vamos supor que estamos mesclando um ramo chamado feature no ramo main, executando o comando do ramo main:
git merge feature
O que aprendemos aqui pode ser aplicado a quaisquer dois ramos, substituindo os nomes adequadamente.
Reverter uma mesclagem que não tem um commit associado
O comando git merge nem sempre cria um novo commit. Um commit é criado somente se a ramificação main tiver divergido da ramificação feature. Como o git revert requer um commit para operar um, não podemos usá-lo neste caso.
As ramificações main e feature divergem quando novos commits são criados em main que não são ancestrais da ramificação feature. Em outras palavras, novos commits foram criados em main depois que feature foi criado.
Se as ramificações não tiverem divergido, quando executarmos o comando git merge feature na ramificação principal, o Git usará o fast-forward para fazer a mesclagem. Isso significa que você move o HEAD do ramo main para o HEAD do ramo feature.

Podemos observar que isso aconteceu observando o resultado de git merge:

Para desfazer essa mesclagem, você só precisa mover o HEAD do ramo main de volta para onde ele estava. Para isso, nós:
- Identifique o site
HEADanterior usando a opçãogit reflog - Redefina o
HEADpara o anterior usando ogit reset --hard, substituindo opeloHEADanterior.
O resultado de git reflog será parecido com o seguinte:

Podemos identificar o HEAD anterior observando a linha que diz "checkout: moving from feature to main" (ele escreve feature e main porque esses são os nomes das nossas ramificações).
Nesse caso, a cabeça anterior é fe59838. Para mover o HEAD do ramo principal de volta para ele e desfazer a mesclagem, usamos o comando:
git reset --hard fe59838

Reverter uma mesclagem que tenha um commit associado
Se a ramificação main e a ramificação feature divergirem, quando mesclarmos duas ramificações, um novo commit será criado, chamado de commit de mesclagem.

O commit de mesclagem aplica as alterações de uma ramificação a outra. Nesse caso, as alterações em feature são aplicadas ao ramo main.
Para reverter as alterações na ramificação main, usamos o git revert no commit da mesclagem. Isso criará um novo commit que desfaz as alterações trazidas para o ramo main com a mesclagem, restaurando efetivamente o estado do ramo principal para o que era antes da mesclagem.
Primeiro, precisamos identificar o hash do commit da mesclagem. Você pode fazer isso usando o comando git log:

Como o commit de mesclagem tem duas origens, a sintaxe de git revert é ligeiramente diferente. Precisamos usar a opção -m 1 para especificar que queremos reverter as alterações relativas ao ramo main:
git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d

Resolução de conflitos ao reverter um compromisso
Às vezes, podem surgir conflitos ao reverter um commit, principalmente se o commit que está sendo revertido entrar em conflito com alterações posteriores na base de código. Nesses casos:
- O Git fará uma pausa na reversão: Precisamos resolver os conflitos manualmente. O Git marcará os arquivos conflitantes e exigirá intervenção.
- Resolver os conflitos: Abrimos cada arquivo conflitante, resolvemos os conflitos marcados pelo Git e salvamos as alterações.
- Prepare os arquivos resolvidos:
git add - Continuar a reversão:
git revert --continue
Conclusão
O uso do git revert para desfazer commits de mesclagem garante que todas as alterações e correções sejam documentadas no histórico de commits.
Além disso, compreender os cenários apropriados para aplicar git reset versus git revert nos permite tomar decisões melhores, especialmente ao considerar fluxos de trabalho colaborativos ou alterações somente locais.
Você pode ler mais sobre esse assunto na seção de perguntas frequentes abaixo. Se você quiser saber mais sobre o Git, recomendo estes recursos:
Perguntas frequentes
Posso reverter uma mesclagem já enviada com o git revert?
Sim, esse é o principal caso de uso do git revert em mesclas. Se as alterações forem locais, git reset é uma maneira mais fácil de desfazer a mesclagem.
Para que outras pessoas vejam as alterações, precisamos enviá-las para o repositório remoto. Portanto, para desfazer uma mesclagem já enviada, fazemos isso:
git revert -m 1
git push origin
Substituindo pelo hash do commit da mesclagem e pelo nome da ramificação em que a mesclagem foi realizada.
O commit de mesclagem será excluído depois que você usar o git revert?
Não. O commit de mesclagem permanece no histórico, mas suas alterações são desfeitas pelo novo commit. O objetivo de desfazer uma mesclagem com git revert é preservar o histórico do commit.
Há outras maneiras, além do git revert, de desfazer uma mesclagem?
Uma maneira alternativa de desfazer uma mesclagem é usar git reset. Esse método redefine o ramo para um estado anterior ao commit da mesclagem. Essa abordagem é mais invasiva e pode causar problemas se outros colaboradores já tiverem baseado seu trabalho nos commits que estamos planejando redefinir. Portanto, ela é recomendada somente quando temos certeza de que não afetará outras pessoas.
git reset --hard
git push --force
Substituindo pelo hash do commit para o qual você deseja voltar.
Quando devo usar o git reset para desfazer uma mesclagem?
Recomendo que você use o site git reset apenas para desfazer uma mesclagem quando ela ocorrer apenas localmente e ainda não tiver sido enviada.
