fast-forwardマージとは何か?
fast-forwardマージは、ブランチを切ってからターゲットブランチが動いていないときに起きます。このときGitは、マージコミットを作らずにポインタを前へスライドさせるだけです。
fast-forwardマージは最もシンプルな種類です。マージ先のブランチが、あなたのブランチが分岐してから変化していなければ、結合するものは何もありません。Gitは単にターゲットブランチのポインタをあなたの最新コミットまで移動させるだけです。その結果は完全に線形な履歴です。
When a fast-forward is possible
fast-forwardは、ターゲットブランチがマージ対象ブランチの直接の祖先である場合にのみ適用されます。つまり、あなたがブランチを切ってからターゲットに新しいコミットがない状態です。分岐がないため調整すべきものがなく、Gitは単にポインタを前進させます。
Fast-forward versus merge commit
マージ時に、fast-forwardを要求することも禁止することもできます。
Controlling fast-forward behavior
git merge --ff-only feature/quick-fix
# or force a merge commit:
git merge --no-ff feature/quick-fixWhy it matters
fast-forwardマージは履歴を線形に保ち、余分なマージコミットをなくします。多くのチームが読みやすさのためにこれを好みます。欠点は、ブランチがかつて存在したことを履歴が示さなくなることです。一部のチームは、特にプルリクエストを追跡するために、no-ffでマージコミットを強制してその記録を残します。
Fast-forward merges and CI/CD
線形なfast-forwardの履歴は、CIで最も推論しやすいものです。各コミットが前のコミットに続くため、リグレッションをbisectで絞り込み、デプロイを変更まで遡って追跡するのが簡単です。マージ前にブランチを最新に保つよう要求すると、多くの場合fast-forwardが生まれ、CIがまさに取り込まれるものをテストしたことを保証します。
Choosing your strategy
- 最もクリーンな線形履歴のために、fast-forwardを許可します。
- ブランチがマージされたことを常に記録するには、no-ffを使います。
- 安全なfast-forwardを可能にするため、ブランチを最新に保つよう要求します。
- 1つの慣例を選び、一貫して適用します。
重要なポイント
- fast-forwardマージは、マージコミットなしでブランチのポインタを移動させるだけです。
- ブランチを切ってからターゲットブランチに新しいコミットがないことが必要です。
- fast-forwardによる線形な履歴は、CIでのbisectやトレースを容易にします。
関連ガイド
What Is a Git Merge?What is a Git merge? An explainer on how merging combines branches, fast-forward versus merge commits, confli…
What Is a Squash Merge?What is a squash merge? Learn how squashing collapses a branch into one commit on merge, the tradeoffs for hi…
What Is a Git Rebase?What is a Git rebase? Learn how rebasing replays commits onto a new base for a linear history, how it differs…