Pular para o conteúdo principal

Git Revert Merge Commit: Um guia com exemplos

Saiba como desfazer com segurança uma mesclagem do Git usando o `git revert`, preservando o histórico de commits e resolvendo possíveis conflitos.
Actualizado 5 de nov. de 2024  · 7 min de leitura

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

Desenvolva habilidades em Python para se tornar um engenheiro de dados profissional.
Comece a usar gratuitamente

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.

Ilustração de como o git revert funciona

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:

Identificando o hash do commit com o registro do git

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 revert cria 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.Explicação do que são ramificações divergentes do Git

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.

Ilustração do que acontece quando movemos o HEAD do <code data-mce-selected=

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

Como identificar que o Fast-forward foi usado para mesclar

Para desfazer essa mesclagem, você só precisa mover o HEAD do ramo main de volta para onde ele estava. Para isso, nós:

  1. Identifique o site HEAD anterior usando a opção git reflog
  2. Redefina o HEAD para o anterior usando o git reset --hard , substituindo o pelo HEAD anterior.

O resultado de git reflog será parecido com o seguinte:

Localizando a referência HEAD antiga

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

Ilustração do que acontece quando movemos o HEAD para trás

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. 

Ilustração de um 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:

Identificando o hash de confirmação de mesclagem

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

Ilustração do que acontece quando revertemos um commit de mesclagem do git

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:

  1. O Git fará uma pausa na reversão: Precisamos resolver os conflitos manualmente. O Git marcará os arquivos conflitantes e exigirá intervenção.
  2. Resolver os conflitos: Abrimos cada arquivo conflitante, resolvemos os conflitos marcados pelo Git e salvamos as alterações.
  3. Prepare os arquivos resolvidos: git add
  4. 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.


François Aubry's photo
Author
François Aubry
LinkedIn
Ensinar sempre foi minha paixão. Desde meus primeiros dias como estudante, eu buscava ansiosamente oportunidades para dar aulas particulares e ajudar outros alunos. Essa paixão me levou a fazer um doutorado, onde também atuei como assistente de ensino para apoiar meus esforços acadêmicos. Durante esses anos, encontrei imensa satisfação no ambiente tradicional da sala de aula, promovendo conexões e facilitando o aprendizado. Entretanto, com o advento das plataformas de aprendizagem on-line, reconheci o potencial transformador da educação digital. Na verdade, participei ativamente do desenvolvimento de uma dessas plataformas em nossa universidade. Estou profundamente comprometido com a integração dos princípios tradicionais de ensino com metodologias digitais inovadoras. Minha paixão é criar cursos que não sejam apenas envolventes e informativos, mas também acessíveis aos alunos nesta era digital.
Temas

Principais cursos de engenharia de dados

programa

Data Engineer

40hrs hr
Gain in-demand skills to efficiently ingest, clean, manage data, and schedule and monitor pipelines, setting you apart in the data engineering field.
Ver DetalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado
Git

blog

O que é Git? Manual completo do Git

Saiba mais sobre o sistema de controle de versão mais conhecido e por que é uma ferramenta de colaboração indispensável para cientistas de dados e programadores.
Summer Worsley's photo

Summer Worsley

14 min

tutorial

Tutorial de push e pull do GIT

Saiba como realizar solicitações Git PUSH e PULL por meio do GitHub Desktop e da linha de comando.

Olivia Smith

13 min

tutorial

Tutorial do GitHub e do Git para iniciantes

Um tutorial para iniciantes que demonstra como funciona o controle de versão do Git e por que ele é crucial para projetos de ciência de dados.
Abid Ali Awan's photo

Abid Ali Awan

17 min

tutorial

Git Rename Branch: Como renomear uma filial local ou remota

Saiba como renomear ramificações locais e remotas do Git usando o terminal ou a interface gráfica do usuário (GUI) de clientes populares como o GitHub.
François Aubry's photo

François Aubry

tutorial

Git Prune: O que é o Git Pruning e como usar o Git Prune

O Git prune é um comando do Git que remove objetos do repositório que não são mais acessíveis a partir de qualquer commit ou branch, ajudando a liberar espaço em disco.
François Aubry's photo

François Aubry

5 min

tutorial

Git Pull Force: Como substituir uma ramificação local por uma remota

Saiba por que o git pull --force não é a melhor maneira de substituir uma ramificação local pela versão remota e descubra o método adequado usando git fetch e git reset.
François Aubry's photo

François Aubry

Ver maisVer mais