fast-forward
別名: non-fast-forward / ファストフォワード / 早送り
現在のブランチが取り込み先の祖先である場合に、Git が merge コミットを作らずブランチ参照を進めるだけで統合する更新方式。条件を満たさない更新は non-fast-forward と呼び push が拒否される。
#git#fast-forward#push#merge#rebase
公開:
定義
fast-forward(早送り)は、現在のブランチのコミットが統合先のコミット履歴に 直接の祖先として連続している 場合に、新しい merge コミットを作らずブランチ参照を進めるだけで取り込みを完了させる Git の動作。
先頭の SHA を更新するだけなので名前のとおり「早送り」される。
詳細
git merge は条件を満たすと既定で fast-forward を選ぶ。
条件は「取り込み元から取り込み先まで分岐なく一直線にたどれる」こと。
条件を満たさず分岐があるときは通常の merge コミット を作る。git merge --no-ff で常に merge コミットを残す指定もできる。git push はリモート側が fast-forward で受け取れないと (non-fast-forward) で拒否し、力技で上書きするには --force / --force-with-lease が必要。
詳細は git-push 公式ドキュメント を参照。
よくある誤解
- fast-forward の方が常に安全: 単純で速いが、ブランチが「いつ何を取り込んだか」が履歴から消える。
レビュー上のトレーサビリティを残したい場合は--no-ffを選ぶ。 --forceで何でも解決する: 共有ブランチで使うと他者の commit を消す事故になる。
想定外の差分があれば中断する--force-with-leaseを使う。
関連
push 時の拒否は non-fast-forward で蹴られる、共通祖先を持たない pull は unrelated histories を参照。