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 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.
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
HEAD
anterior usando a opçãogit reflog
- Redefina o
HEAD
para o anterior usando ogit reset --hard
, substituindo opelo
HEAD
anterior.
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.