Curso
Se você já trabalhou em um projeto com vários desenvolvedores (ou mesmo se já gerenciou vários recursos), sabe que a ramificação é essencial para manter as coisas organizadas. Mas, em algum momento, todos esses ramos precisam voltar a se unir - e é aí que entra o git merge
.
Neste tutorial, apresentarei os diferentes tipos de mesclagens do Git, como elas funcionam e como resolver conflitos de mesclagem quando as coisas não saem como planejado. Por fim, compartilharei algumas práticas recomendadas para ajudar você a usar o git merge
de forma eficaz e evitar armadilhas comuns.
O que é o git merge?
Em uma configuração de equipe, os desenvolvedores geralmente trabalham em diferentes recursos, correções de bugs e melhorias em ramificações separadas. Após a conclusão do trabalho, eles usam o site git merge
para integrar essas alterações.
A mesclagem combina as alterações de um ramo em outro, preservando o histórico completo da versão. Ele unifica o histórico de commits de ambas as ramificações.
Vamos entender o fluxo de trabalho por meio de um exemplo.
Um commit de base comum diverge em duas ramificações, levando a dicas principais e de recursos separadas antes da fusão. Imagem do autor.
Na imagem acima, as ramificações principal e de recursos criaram novos commits desde que a ramificação de recursos foi criada.
Uma ramificação de recurso e a ramificação principal divergem de uma base comum e são posteriormente combinadas em um único commit de mesclagem. Imagem do autor.
O Git merge pega todos os novos commits de ambas as ramificações, a partir de sua base comum, e os combina em um único commit de merge. Em seguida, ele atualiza o ponteiro principal para apontar para esse novo commit de mesclagem.
Uso básico do comando git merge
A mesclagem não é apenas executar o git merge e encerrar o dia - há algumas etapas importantes para que você coloque tudo em ordem primeiro. Nesta seção, você verá todo o processo, desde a preparação das ramificações até a conclusão de uma mesclagem bem-sucedida.
Etapa 1: Preparando-se para uma fusão
Somente as alterações confirmadas em ambos os ramos podem ser mescladas. Portanto, use o comando git status
para verificar se há alterações não confirmadas e confirme-as usando o comando git commit
antes de fazer a mesclagem.
Etapa 2: Verificar a ramificação de destino
Antes de executar git merge
, você deve mudar para o ramo de destino, geralmente o ramo principal. Você pode mudar para o ramo principal usando git checkout main
ou git switch main
.
Etapa 3: Mesclando uma ramificação
Certifique-se de que a ramificação principal esteja atualizada com o repositório remoto. Para isso, execute git pull origin main
.
Agora, você está finalmente pronto para mesclar o ramo de recursos com o ramo principal! Você pode usar um comando como o seguinte:
git merge feature-branch
Etapa 4: Resolução de conflitos de mesclagem (se houver)
O Git tenta resolver automaticamente os conflitos que podem ocorrer durante as mesclagens. No entanto, pode ser necessária uma intervenção manual quando você não conseguir resolver o conflito por conta própria.
Por exemplo, se as mesmas linhas no mesmo arquivo forem modificadas em ramificações diferentes, poderão ocorrer conflitos de mesclagem.
Quando o Git detecta um conflito, ele pausa a mesclagem e pede que você o resolva. Nesse caso:
- Execute
git status
para ver quais arquivos têm conflitos. - Abra esses arquivos.
- Revise as linhas de código conflitantes e atualize-as para garantir a consistência em ambas as ramificações.
Etapa 5: Confirmação da mesclagem
Depois de resolver os conflitos, use o comando git add .
para preparar os arquivos corrigidos. Em seguida, conclua a mesclagem fazendo o commit com uma mensagem:
git merge -m “resolved conflicts”
Nas seções posteriores, veremos como resolver conflitos de mesclagem com mais profundidade.
Para os iniciantes, aqui está uma folha de dicas completa do Git que abrange todos os comandos essenciais para criar, atualizar, excluir e gerenciar ramificações.
Se você já tem alguma experiência com o Git e precisa se atualizar sobre os comandos importantes, confira este tutorial sobre os comandos mais usados do Git com exemplos.
Aprenda hoje os fundamentos do Git
Tipos de mesclagens no Git
Entender os tipos de merge do Git ajudará você a escolher a estratégia certa para o seu cenário. Aqui estão as três abordagens comuns para a fusão.
Fusão de avanço rápido
Quando o branch de base não tem novos commits desde que o branch de recurso foi criado, o Git usa uma abordagem de avanço rápido.
Se o seu novo ramo de recursos for atualizado enquanto o ramo principal permanecer inalterado, o commit de mesclagem moverá o ponteiro de cabeçalho do ramo principal para o ramo de recursos.
Nenhum commit de mesclagem adicional é criado, o que mantém o histórico de commits limpo e linear.
Mesclagem de três vias
Se as ramificações de base e de recurso tiverem novos commits, o Git encontrará seu ancestral comum e criará um novo commit de mesclagem. Esse commit combina os históricos de ambas as ramificações, preservando o histórico individual da ramificação de recursos e da ramificação principal.
No exemplo abaixo, "E" e "G" são novos commits no ramo principal depois que o ramo de recursos foi criado.
C---D---F (feature-branch)
/
A---B---E---G (main)
Um novo commit de mesclagem, "M", é criado, preservando o histórico das ramificações principal e de recursos.
C---D---F
/ \
A---B---E---G---M (main)
Fusão de abóbora
Squash merge comescla todas as alterações de um ramo de recurso em um único commit e o mescla no ramo de destino. Ele não preserva o histórico de commits individuais do ramo de recursos.
git merge --squash feature_branch_name
Uma mesclagem de squash é especialmente útil para evitar a desordem de vários commits pequenos e, ao mesmo tempo, manter o estado final do recurso no branch de destino.
Mesclagem de várias ramificações
Ao trabalhar em projetos grandes, talvez você precise mesclar várias ramificações - uma de cada vez ou todas de uma vez. A abordagem que você escolher depende do seu fluxo de trabalho e da complexidade das alterações. Nesta seção, explorarei os dois métodos e quando usá-los de forma eficaz.
Mesclar mais de uma ramificação sequencialmente
Para mesclar ramificações uma a uma, use o comando merge sequencialmente para cada ramificação de recurso.
Etapa 1: Alterne para o ramo de destino no qual você deseja mesclar as alterações.
git checkout target_branch_name
Etapa 2: Faça a fusão do primeiro ramo de recursos, conforme mostrado abaixo.
git merge feature_branch_1
Etapa 3: Faça a fusão do segundo ramo de recursos conforme mostrado.
git merge feature_branch_2
Repita esse processo até que todas as outras ramificações sejam mescladas.
Mesclando mais de uma ramificação em paralelo
Siga estas etapas para mesclar várias ramificações de recursos de uma só vez.
Etapa 1: Alterne para o ramo de destino no qual você deseja mesclar as alterações.
git checkout target_branch_name
Etapa 2: Execute o seguinte comando com várias ramificações de recursos
git merge feature_branch_1 feature_branch_2 feature_branch_3
Quando o Git mescla várias ramificações em paralelo, podem ocorrer conflitos. Se isso acontecer, o Git solicitará que você os resolva manualmente.
Tratamento de conflitos com várias mesclagens
A mesclagem de várias ramificações nem sempre é simples, especialmente quando uma ramificação depende de outra.
Por exemplo, mesclar feature_x
em main
antes de feature_y
pode gerar conflitos. Da mesma forma, se diferentes ramificações modificarem os mesmos arquivos, as mesclagens paralelas podem levar a conflitos que precisam de uma resolução cuidadosa.
Siga estas etapas para resolver conflitos de mesclagem:
- Etapa 1: Execute
git status
para ver quais arquivos causam conflitos. - Etapa 2: Abra os arquivos conflitantes e corrija-os.
- Etapa 3: Adicione as alterações ao estágio e faça o commit.
Compreensão do histórico de commits de mesclagem
Para conflitos complexos, você pode precisar de mais informações do que as fornecidas pelo site git status
. Nesses casos, você pode usar comandos como git log
ou git show
para se aprofundar no histórico.
git log
Mostra todo o histórico de commits, inclusive os commits de mesclagem. Isso ajuda a identificar uma mescla específica onde o problema ocorre.git show
: Se você encontrar um commit de mesclagem suspeito com o comando acima, usegit show
para inspecioná-lo. Esse comando fornece uma visão detalhada do commit, mostrando o que foi alterado durante a mesclagem. Ele também gera um identificador exclusivo para a ramificação principal antes de ocorrer uma mesclagem específica.git diff
: Você pode usar os identificadores exclusivos dos ramos pai e mesclado dos comandos anteriores e usargit diff
para comparar as alterações entre esses dois estados.
Práticas recomendadas de mesclagem do Git
Às vezes, a mesclagem pode ser confusa, especialmente quando vários desenvolvedores estão trabalhando na mesma base de código.
Embora tenhamos abordado como resolver conflitos quando eles surgem, a melhor abordagem é evitá-los antes que aconteçam. Nesta seção, abordaremos dicas práticas para manter as mesclagens suaves e o histórico do Git limpo.
Mantenha as filiais pequenas e focadas
Ramos grandes aumentam o risco de sobreposição de edições, o que gera mais conflitos. Para minimizar isso, trabalhe em um único recurso por ramificação e mantenha as ramificações pequenas e focadas.
Extrair e mesclar com frequência
Puxe as alterações mais recentes do repositório remoto para manter sua ramificação base atualizada antes de fazer o merge. Faça pull de atualizações regularmente do branch principal para o branch de recursos para mantê-los sincronizados. Isso evita conflitos grandes e complexos mais tarde.
Usar as ferramentas de mesclagem integradas do Git
Em vez de editar arquivos manualmente, você pode usar as ferramentas internas do git para resolver conflitos em uma interface visual. Quando você executa git mergetool
, três opções são abertas:
- LOCAL - Versão do ramo principal. Ao escolher essa opção, você mantém o conteúdo do arquivo conflitante do ramo principal e ignora as alterações do ramo de recursos.
- REMOTE - A versão da ramificação do recurso. Ao selecionar essa opção, você aplica o conteúdo do ramo de recursos ao arquivo em conflito.
- BASE - combinará as alterações dos arquivos conflitantes de ambas as ramificações e as mesclará.
Mesclar em ordem
Ao mesclar várias ramificações, a ordem é importante, especialmente se um recurso depender de outro. Se feature_x
depender de feature_y
, mesclar feature_x
primeiro pode gerar conflitos. Para evitar isso, sempre mescle as ramificações na ordem de suas dependências para manter o processo tranquilo e minimizar os conflitos.
Fusão de abóbora
Conforme mencionado anteriormente, a mesclagem por squash consolida todos os commits de uma ramificação de recurso em um único commit, mantendo o histórico de commits limpo e reduzindo possíveis conflitos de mesclagem.
Uma abordagem alternativa é o rebasing, que aplica as alterações do ramo de recursos diretamente sobre o ramo de base. Isso cria um histórico linear e evita commits de mesclagem desnecessários. No entanto, ambos os métodos reescrevem o histórico e não preservam os commits individuais do ramo de recursos.
Conclusão
Neste tutorial de mesclagem do Git, abordamos tudo, desde os conceitos básicos de mesclagem até as práticas recomendadas para evitar conflitos. Entender como usar o git merge
de forma eficaz ajuda as equipes a colaborar sem problemas, mantendo os fluxos de trabalho tranquilos e o histórico de código limpo.
Se você deseja aprofundar suas habilidades no Git, confiraeste curso de Git intermediário para dominarfluxos de trabalho e técnicas mais avançados!
Aprenda hoje os fundamentos do Git
Perguntas frequentes
Qual é a diferença entre o git merge e o git rebase?
Embora ambos os comandos integrem as alterações de um ramo em outro, o git merge
cria um novo commit de mesclagem, preservando o histórico de ambos os ramos. Por outro lado, o git rebase
aplica commits do ramo de recursos diretamente no ramo de destino, resultando em um histórico de commits linear, mas reescrevendo o histórico no processo.
Posso desfazer uma mesclagem no Git?
Sim, se você ainda não tiver feito a mesclagem, poderá usar:
git reset --hard HEAD~1
Isso redefine sua ramificação para o estado anterior à mesclagem. Se a mesclagem já tiver sido enviada, você precisará usar git revert
para desfazer as alterações com segurança e manter o histórico intacto.
Como faço para mesclar uma ramificação remota em minha ramificação local?
Para mesclar um ramo remoto em seu ramo local, siga estas etapas:
git fetch origin
git checkout my-branch
git merge origin/feature-branch
Isso garante que você esteja mesclando as atualizações mais recentes do repositório remoto.
Como posso evitar conflitos de mesclagem desnecessários?
Para minimizar os conflitos:
- Faça regularmente as alterações mais recentes antes de iniciar um novo trabalho (
git pull
). - Faça a mesclagem na ordem das dependências se várias ramificações dependerem umas das outras.
- Use sinalizadores de recursos para integrar o código progressivamente em vez de ramificações de longa duração.
O que acontece quando eu mesclo uma ramificação que já foi mesclada?
Se uma ramificação já tiver sido mesclada, a execução de git merge feature-branch
novamente não mudará nada. O Git reconhecerá que as ramificações compartilham um histórico comum e simplesmente confirmará que tudo está atualizado.
Posso mesclar várias ramificações de uma vez?
Não, o Git não é compatível com a mesclagem de várias ramificações em um único comando. Você precisa mesclá-los sequencialmente:
git merge feature-branch-1
git merge feature-branch-2
Se necessário, você pode criar uma ramificação de integração na qual mescla várias ramificações e, em seguida, mescla essa ramificação em main
.
Devo usar o git merge --no-ff ou o git merge --ff?
--no-ff
(sem mesclagem rápida) cria um novo commit de mesclagem, facilitando o rastreamento do histórico da ramificação.--ff
(mesclagem de avanço rápido) aplica as alterações diretamente, se possível, evitando commits extras.
Para projetos em que o rastreamento de ramificações de recursos é importante, recomenda-se o site --no-ff
.
Srujana é redatora freelancer de tecnologia e tem um diploma de quatro anos em Ciência da Computação. Escrever sobre vários tópicos, incluindo ciência de dados, computação em nuvem, desenvolvimento, programação, segurança e muitos outros, é algo natural para ela. Ela gosta de literatura clássica e de explorar novos destinos.