O que é um fast-forward merge?
Um fast-forward merge acontece quando a branch alvo não se moveu desde que você criou sua branch, então o Git apenas desliza o ponteiro para frente, sem commit de merge.
Um fast-forward merge é o tipo mais simples. Se a branch na qual você está fazendo o merge não mudou desde que sua branch divergiu, não há nada a combinar; o Git pode apenas mover o ponteiro da branch alvo até o seu commit mais recente. O resultado é um histórico perfeitamente linear.
When a fast-forward is possible
Um fast-forward se aplica apenas quando a branch alvo é um ancestral direto da branch que está sendo mesclada, o que significa que o alvo não teve novos commits desde que você criou sua branch. Sem divergência, não há nada a reconciliar, então o Git simplesmente avança o ponteiro.
Fast-forward versus merge commit
Você pode solicitar ou proibir um fast-forward ao fazer o merge.
git merge --ff-only feature/quick-fix
# or force a merge commit:
git merge --no-ff feature/quick-fixWhy it matters
Os fast-forward merges mantêm o histórico linear e livre de commits de merge extras, o que muitas equipes preferem pela legibilidade. A desvantagem é que o histórico não mostra mais que uma branch existiu. Algumas equipes forçam um commit de merge com no-ff para preservar esse registro, especialmente para rastrear pull requests.
Fast-forward merges and CI/CD
Um histórico linear, de fast-forward, é o mais fácil de raciocinar no CI: cada commit segue o anterior, então usar bisect em uma regressão e rastrear um deploy de volta a uma mudança é direto. Exigir que as branches estejam atualizadas antes do merge muitas vezes produz fast-forwards e garante que o CI testou exatamente o que entrou.
Choosing your strategy
- Permita fast-forwards para o histórico linear mais limpo.
- Use no-ff para sempre registrar que uma branch foi mesclada.
- Exija que as branches estejam atualizadas para habilitar fast-forwards seguros.
- Escolha uma convenção e aplique-a de forma consistente.
Principais conclusões
- Um fast-forward merge apenas move o ponteiro da branch, sem commit de merge.
- Ele exige que a branch alvo não tenha novos commits desde que você criou a sua.
- O histórico linear dos fast-forwards facilita o bisect e o rastreamento no CI.