Merge é uma operação no Git que combina alterações de um branch em outro, criando um commit de mesclagem (merge commit). O Git suporta várias estratégias: fast-forward (histórico linear), three-way merge (com criação de merge commit) e squash merge (compressão de todos os commits em um). Segundo git-scm.com, 2025, o merge continua sendo o mecanismo de integração de código mais utilizado no desenvolvimento Git em equipe.
Principais pontos
Merge (fusão) é uma operação fundamental no Git que combina alterações de um branch (source) em outro (target). Como resultado da mesclagem, o branch alvo recebe todos os commits do branch fonte que ainda não estavam nele. Dependendo da situação, o Git pode executar o merge de três maneiras diferentes.
O principal valor do merge é preservar o histórico: o merge commit registra o fato da fusão de branches, preservando informações sobre quando e quais branches foram mesclados. Isso facilita a auditoria de alterações, a busca por regressões e a compreensão da cronologia do desenvolvimento. Em projetos grandes, o merge commit é a forma padrão de integração de código.
Segundo o GitLab Flow, merge commits são usados em 73% das equipes que trabalham com Git. Abordagens alternativas (rebase, squash) são preferidas por equipes focadas em histórico linear. A escolha da estratégia depende do tamanho da equipe, frequência de lançamentos e convenções aceitas no projeto.
Merge é necessário quando um desenvolvedor terminou de trabalhar em uma funcionalidade e deseja integrá-la ao develop ou main. Um cenário típico: um desenvolvedor criou um branch de funcionalidade a partir do develop, trabalhou nele por vários dias, e durante esse tempo novos commits de outros membros da equipe apareceram no develop. Antes de mesclar, é necessário combinar as alterações — e para isso se usa o merge.
Sem o merge, é impossível trabalhar colaborativamente em um único código no Git. Toda vez que dois desenvolvedores fazem alterações simultâneas em uma base de código, seus branches divergem. O merge é a única maneira de reunir essas alterações sem perda de dados.
O Git suporta três tipos de merge, cada um projetado para seu próprio cenário. A escolha do tipo de mesclagem afeta o histórico de commits, a facilidade de reversão e a legibilidade do log.
Fast-forward ocorre quando o branch alvo não teve novos commits desde a criação do branch fonte. Neste caso, o Git simplesmente move o ponteiro do branch alvo para frente, para o último commit do branch fonte. O histórico permanece linear, sem merge commit.
# Fast-forward merge: develop não mudou desde a criação da feature
git checkout develop
git merge feature/new-login
# Resultado: o ponteiro do develop moveu-se para o final da feature
# Nenhum merge commit foi criado
Fast-forward é conveniente para branches de curta duração onde um desenvolvedor trabalhou sozinho. Mas esta abordagem tem uma desvantagem: perde-se a informação de que o branch existiu — todos os commits parecem feitos diretamente no develop.
Three-way merge é executado quando ambos os branches têm novos commits após o ponto de divergência. O Git cria um merge commit separado com dois pais, que registra o fato da fusão dos branches. Esta abordagem é recomendada para branches de funcionalidade no desenvolvimento em equipe.
# Three-way merge forçado com a flag --no-ff
git checkout develop
git merge --no-ff feature/new-login
# Um merge commit foi criado com a mensagem padrão
# Pode definir sua própria mensagem através de -m
git merge --no-ff feature/new-login -m "Merge feature/new-login into develop"
A flag --no-ff garante a criação de um merge commit, mesmo que o fast-forward seja possível. Esta é uma boa prática para preservar informações de ramificação em um projeto.
Squash merge comprime todos os commits do branch fonte em um e o aplica ao alvo. O histórico da funcionalidade é perdido — um único commit com todas as alterações termina no branch. Isso é conveniente quando commits detalhados em um branch de funcionalidade não agregam valor ao histórico geral.
# Squash merge: todos os commits da feature são comprimidos em um
git checkout develop
git merge --squash feature/experimental
git commit -m "feat: experimental login flow (squashed)"
Squash é adequado para rascunhos, branches experimentais e situações onde é importante manter um histórico limpo. A desvantagem é que a conexão com os commits originais é perdida, dificultando a reversão de alterações individuais.
Ours e Theirs são duas estratégias especiais de merge no Git. Ours ignora completamente as alterações do branch fonte, mantendo apenas o que está no alvo. Theirs, ao contrário, aceita a versão do branch fonte em qualquer conflito. Essas estratégias são úteis ao mesclar grandes volumes de código quando se sabe antecipadamente qual versão deve prevalecer.
O mecanismo de merge no Git é baseado na comparação de três pontos: o ancestral comum (merge base), o estado do branch fonte e o estado do branch alvo. O Git encontra o merge base — o último commit comum a ambos os branches — e calcula quais alterações ocorreram em cada branch após a divergência.
O Git usa um algoritmo de mesclagem trilateral que considera não apenas as duas versões do arquivo comparadas, mas também seu ancestral comum. Graças a isso, o Git pode resolver automaticamente situações onde as alterações em um branch não afetam áreas modificadas do outro — mesmo que ambos os arquivos tenham sido modificados.
Considere um cenário: dois desenvolvedores trabalham em arquivos diferentes em um mesmo branch de funcionalidade. O primeiro alterou LoginActivity.kt, o segundo alterou ProfileFragment.kt. Quando eles mesclam suas alterações, o Git vê que as alterações afetaram arquivos diferentes e realiza o merge automaticamente, sem intervenção humana.
Se ambos os desenvolvedores alteraram LoginActivity.kt, mas em métodos diferentes — o Git também lidará automaticamente, mesclando as alterações linha por linha. Um conflito surge apenas se ambos alteraram as mesmas linhas ou se um excluiu código que o outro modificou.
Um conflito de merge ocorre quando o Git não consegue mesclar automaticamente as alterações porque ambos os branches modificaram as mesmas linhas de maneira diferente. Neste caso, o Git marca as áreas conflitantes nos arquivos e aguarda a resolução manual do desenvolvedor.
As áreas de conflito são marcadas com marcadores especiais: <<<<<<< HEAD mostra o código do branch alvo, ======= é o separador, >>>>>>> source-branch mostra o código do branch fonte. O desenvolvedor deve escolher manualmente qual versão manter ou combiná-las.
# 1. Executar merge e ver o conflito
git merge feature/new-login
# Saída: CONFLICT (content): Merge conflict in LoginActivity.kt
# 2. Ver a lista de arquivos com conflitos
git status
# both modified: src/ui/login/LoginActivity.kt
# 3. Resolver o conflito: editar o arquivo, remover marcadores
# 4. Adicionar o arquivo resolvido e finalizar o merge
git add src/ui/login/LoginActivity.kt
git merge --continue
# ou: git commit (sem --continue)
Existem ferramentas para resolver conflitos: git mergetool abre um mesclador visual (Meld, Beyond Compare, VS Code). Muitos desenvolvedores preferem resolver conflitos na IDE — IntelliJ IDEA e Android Studio fornecem uma ferramenta integrada com comparação de três painéis que simplifica enormemente este processo.
Dicas para resolver conflitos: sempre entenda o que cada lado do conflito faz, não exclua código alheio sem entender sua lógica, e se o conflito for muito complexo — envolva os autores de ambos os branches em uma resolução conjunta.
A escolha entre Merge e Rebase é uma das decisões arquitetônicas mais comuns no Git. Ambas as abordagens combinam alterações, mas fazem de maneira diferente: merge preserva o histórico de ramificação, rebase reescreve o histórico tornando-o linear.
Muitas equipes usam uma abordagem híbrida: rebase para atualizar o branch de funcionalidade com develop (git rebase develop), e então merge com a flag --no-ff para registrar a fusão. Isso proporciona um histórico limpo dentro da funcionalidade e pontos de fusão informativos no nível do develop.
Perguntas frequentes
Sem --no-ff o Git executa um fast-forward merge se possível — simplesmente move o ponteiro do branch. Com --no-ff o Git sempre cria um merge commit, preservando informações de ramificação. Recomendado para branches de funcionalidade no desenvolvimento em equipe.
Use git mergetool ou a ferramenta integrada da IDE. Se o conflito envolver dezenas de arquivos — os branches podem ter divergido demasiadamente. Nesse caso, discuta o plano de mesclagem com a equipe, possivelmente dividindo-o em várias etapas.
Sim: git merge --abort cancela o merge se ainda não foi concluído (conflito). Se o merge já foi concluído — use git reset --hard HEAD~1 ou git revert -m 1 <merge-commit> para uma reversão segura.
Recomendado para trabalho em equipe. O merge commit registra o fato da mesclagem, contém referências a ambos os branches e simplifica a compreensão do histórico. Para branches pessoais ou experimentais, squash merge ou fast-forward são aceitáveis.
O Git não pode mesclar automaticamente arquivos binários — ele seleciona uma versão por completo. Para arquivos binários (imagens, .aab, .apk) recomenda-se minimizar alterações paralelas e usar Git LFS para arquivos grandes.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também