A capacidade de fácil mesclagem do git é um de seus pontos fortes. Durante um merge, o git usa o fast-forward merge quando percebe que o HEAD do branch atual é um ancestral do commit que você está tentando fundir. Em uma mesclagem de avanço rápido, não há nenhum novo commit. Git apenas move o ponteiro. Se este comportamento não for desejável, você pode usar o sinalizador no-ff para criar um novo commit para a fusão.
Como o Merge fica com e sem o Fast-Forward
Depois de um avanço rápido, seu histórico do git ficará assim:
C0 -> C1 -> C2—> C3
Para o mesmo número de confirmações, aqui está um histórico de mesclagem sem avanço rápido:
No primeiro caso, não há indícios de que tenha havido ramificação. No segundo caso, o histórico está mostrando um commit C4 para indicar onde ocorreu a fusão.
Percorrendo um exemplo
Você criará um repositório git, criará um branch e então tentará mesclar com e sem fast-forward.
Seção 1: configuração
Primeiro, você pode criar o repositório git com as seguintes etapas:
$ mkdir my_project$ cd my_project
$ git init
$ touch a.txt
$ git add -A
$ git commit -m 'C0: Adicionando um.txt'
Agora vamos criar um branch chamado features e fazer algumas mudanças:
$ git branch features$ git checkout features
$ touch b.txt
$ git add -A
$ git commit -m 'C1: Adicionando b.txt'
$ touch c.txt
$ git add -A
$ git commit -m 'C2: Adicionando c.txt'
$ touch d.txt
$ git add -A
$ git commit -m 'C3: Adicionando d.txt'
Seção 2: Mesclar com Fast-Forwarding
Vamos voltar ao branch master e mesclar o branch de recursos nele:
$git checkoutmestre$git mergerecursos
Saída:
Atualizando 08076fb..9ee88ebAvanço rápido
b.txt | 0
c.txt | 0
d.txt | 0
3 arquivos alterados, 0 inserções (+), 0 exclusões (-)
modo de criação 100644 b.txt
modo de criação 100644 c.txt
modo de criação 100644 d.txt
Se você verificar o histórico, verá:
$ git log --oneline9ee88eb C3: Adicionando d.txt
c72b92c C2: Adicionando c.txt
2e4039e C1: Adicionando b.txt
08076fb C0: Adicionando um.txt
Portanto, todos os commits do branch de recursos estão no branch master agora. Se você continuar fazendo alterações no master, não há como saber quando o branch de recursos foi incorporado a ele.
Seção 3: sem avanço rápido
Repita a Seção 1 para uma nova pasta.
Em seguida, tente mesclar sem avanço rápido:
$git checkoutmestre$git merge --no-ffrecurso
Isso abrirá o seguinte no editor de texto padrão do git:
Juntar ramificação'recursos'# Por favor, insira uma mensagem de confirmação para explicar por que essa mesclagem é necessária,
# especialmente se ele mescla um upstream atualizado em um branch de tópico.
#
# Linhas começando com '#' serão ignoradas e uma mensagem vazia será cancelada
# o commit.
Modifique os comentários. Neste caso, você pode apenas adicionar C4: antes de Merge branch ‘features’. A saída deve ser semelhante a esta:
Mesclagem feita pela estratégia 'recursiva'.b.txt | 0
c.txt | 0
d.txt | 0
3 arquivos alterados, 0 inserções (+), 0 exclusões (-)
modo de criação 100644 b.txt
modo de criação 100644 c.txt
modo de criação 100644 d.txt
Agora, se você verificar o histórico, ele deve se parecer com o seguinte:
$ git log --onelinee071527 C4: Mesclar 'recursos' de ramificação
bb79c25 C3: Adicionando d.txt
692 relevantc C2: Adicionando c.txt
a0df62a C1: Adicionando b.txt
7575971 C0: Adicionando um.txt
Você pode ver que, embora tenha exatamente as mesmas alterações, esta versão de mesclagem tem o commit C4 extra que significa a mesclagem do branch de recursos no master.
Conclusão
O sinalizador git merge no-ff ajuda a criar um histórico mais legível. Ele permite que você coloque tags que mostram claramente onde ocorreram as mesclagens. Isso pode economizar tempo e esforço durante a depuração.