Usando ramificações

Opções e exemplos de estratégias do Git Merge

Quando uma parte do trabalho for concluída, testada e estiver pronta para ser mesclada de volta à linha principal de desenvolvimento, a equipe vai ter que fazer algumas escolhas de política. Quais são as opções de estratégia de mesclagem disponíveis? Neste artigo vamos examinar as possibilidades e oferecer algumas observações sobre como a Atlassian funciona. Esperamos que no final você tenha as ferramentas para decidir o que funciona melhor para a equipe.

Estratégias para Git merge

Uma mesclagem ocorre ao combinar duas ramificações. O Git vai pegar dois (ou mais) indicadores de confirmação e vai tentar encontrar uma confirmação base em comum entre eles. O Git tem diversos métodos diferentes para encontrar uma confirmação base, estes métodos são chamados de "estratégias de mesclagem". Depois que o Git encontrar uma confirmação base em comum, ele vai criar uma nova "confirmação de mesclagem" que vai combinar as mudanças das confirmações de mesclagem específicas. Tecnicamente, uma confirmação de mesclagem é uma confirmação regular que tem duas confirmações mãe.

O git merge vai selecionar por conta própria a estratégia de mesclagem, a menos que ela tenha sido especificada. Os comandos git merge e git pull podem ser transmitidos com uma opção (estratégia) -s. A opção -s pode ser anexada com o nome da estratégia de mesclagem escolhida. Se não tiver sido especificada, o Git vai selecionar a estratégia de mesclagem mais adequada com base nas ramificações proporcionadas. A lista a seguir informa as estratégias de mesclagem disponíveis.

Recursive

git merge -s recursive branch1 branch2

Ela opera em dois heads. Recursive é a estratégia de mesclagem padrão ao empurrar ou mesclar uma ramificação. Além disso, ela pode detectar e manipular mesclagens envolvendo renomeações, mas, no momento, não pode fazer uso de cópias detectadas. É a estratégia de mesclagem padrão ao empurrar ou mesclar uma ramificação.

Resolver

git merge -s resolve branch1 branch2

Ela apenas pode resolver dois heads usando um algoritmo de mesclagem de 3 vias. Ela tenta detectar com cuidado as ambiguidades da mesclagem cruzada e é considerada segura e rápida.

Octopus

git merge -s octopus branch1 branch2 branch3 branchN

É a estratégia de mesclagem padrão para mais de dois heads. Quando mais de uma ramificação é transmitida, o octopus é acionado. Se a mesclagem tiver conflitos que precisam de resolução manual, o octopus vai recusar a tentativa de mesclagem. Ela é usada na maioria das vezes para agrupar heads semelhantes de ramificação de recurso.

Ours

git merge -s ours branch1 branch2 branchN

A estratégia Ours opera no número N múltiplo de ramificações. O resultado da mesclagem de saída sempre é o do HEAD da ramificação atual. O termo "ours" implica a preferência, ignorando todas as mudanças de todas as outras ramificações. Ela deve ser usada para combinar o histórico de ramificações semelhantes de recursos.

Subtree

git merge -s subtree branchA branchB

É uma extensão da estratégia recursiva. Ao mesclar A e B, se B for uma subárvore filha de A, B vai ser primeiro atualizado para refletir a estrutura de árvore de A. Esta atualização também é realizada à árvore ancestral comum compartilhada entre A e B.

Tipos de estratégia de Git Merge

Mesclagens explícitas

As mesclagens explícitas são o tipo padrão de mesclagem. São "explícitas" porque criam uma nova confirmação de mesclagem. Isto altera o histórico de confirmações e mostra, com clareza, onde uma mesclagem foi executada. O conteúdo da confirmação de mesclagem também é explícito pelo fato de mostrar quais confirmações foram mães da confirmação de mesclagem. Algumas equipes evitam as mesclagens explícitas, porque elas adicionariam "ruído" ao histórico do projeto.

mesclagem implícita por rebase ou mesclagem de avanço rápido

Enquanto as mesclagens explícitas criam uma confirmação de mesclagem, as implícitas não. Uma mesclagem implícita pega diversas confirmações de um head de ramificação específico e as aplica ao topo da ramificação alvo. Elas são geradas por eventos de rebase ou mesclagens de avanço rápido. Uma mesclagem implícita é uma seleção ad-hoc de confirmações de uma ramificação específica.

Squash na mesclagem, na maioria da vezes sem mesclagem explícita

Outro tipo de mesclagem implícita é o squash. Ele pode ser executado durante um rebase interativo. Uma mesclagem de squash vai pegar as confirmações de uma ramificação alvo e vai combinar ou fazer squash com elas em uma única confirmação. Esta confirmação vai ser, então, anexada ao HEAD da ramificação base da mesclagem. Um squash costuma ser usado para manter um "histórico limpo" durante uma mesclagem. A ramificação de mesclagem alvo pode ter um histórico detalhado de confirmações frequentes. Ao passar por squash e mesclagem o histórico de confirmações das ramificações alvo se tornam uma "confirmação de ramificação" única com squash. Essa técnica é útil com fluxos de trabalho do git que utilizam ramificações de recurso.

Opções de estratégia de Git Merge Recursive

A estratégia "recursive" apresentada acima tem seu próprio subconjunto de opções adicionais de operação.

ours

Não confundir com a estratégia de mesclagem "ours". Esta opção entra em conflito por ser resolvida de forma automática e limpa, favorecendo a versão "our". As mudanças do lado "theirs" são incorporadas de forma automática se não estiverem em conflito.

theirs

Oposto da estratégia "ours". A opção "theirs" favorece a árvore de mesclagem externa na resolução de conflitos.

patience

Esta opção utiliza tempo extra para evitar mesclagens incorretas em linhas de correspondência sem importância. Ela é mais bem utilizada quando as ramificações a serem mescladas são muito divergentes.

diff-algorithim

Esta opção permite a especificação de diff-algorithim explícito. Os diff-algorithims são compartilhados com o comando git diff.

ignore-*

    ignore-space-change
    ignore-all-space
    ignore-space-at-eol
    ignore-cr-at-eol

Um conjunto de opções que visa caracteres de espaço em branco. Qualquer linha correspondente ao subconjunto da opção transmitida vai ser ignorada.

renormalize

Esta opção executa check-out e check-in em todas as árvores git ao resolver uma mesclagem em três vias. Essa opção deve ser usada com ramificações de mesclagem com estados de checkin/checkout diferentes.

no-normalize

Desativa a opção renormalize. Isto substitui a variável de configuração merge.renormalize.

no-renames

Esta opção vai ignorar arquivos renomeados durante a mesclagem.

find-renames=n

Este é o comportamento padrão. A mesclagem recursiva vai honrar as renomeações de arquivo. O parâmetro n pode ser usado para transmitir um limite para similaridade da renomeação. O valor padrão n é 100%.

subtree

Esta opção é derivada da estratégia "subtree". Enquanto a estratégia opera em duas árvores e modifica como fazer com que correspondam em um ancestral compartilhado, esta opção opera nos metadados do caminho da árvore para este fim.

Política de Git Merge

A Atlassian prefere usar mesclagens explícitas. O motivo é muito simples: as mesclagens explícitas oferecem ótima rastreabilidade e contexto dos recursos sendo mesclados. É recomendado fazer um rebase de limpeza do histórico antes de compartilhar uma ramificação de recurso para revisão, porém, isso não muda a política, apenas a amplia.

Pronto para tentar a ramificação?

Tente este tutorial interativo.

Comece agora mesmo