ブランチを統合する - git merge

2つ以上の開発履歴を統合します。

概念図

git merge diagram

構文

bash
git merge <branch>

使用例

feature/loginブランチをマージ

bash
git merge feature/login

マージコミットを必ず作成

bash
git merge --no-ff feature/login

fast-forward と --no-ff の違い

マージには「fast-forward(ff)」と「no-fast-forward(--no-ff)」の2つの挙動があります。

項目 fast-forward(デフォルト) --no-ff
マージコミット 作られない 必ず作られる
履歴 直線的(ブランチの痕跡なし) 分岐と合流が明確に残る
git log --graph 一本線 分岐・合流が見える
用途 個人作業、小さな変更 チーム開発、PR マージ

チーム開発では --no-ff が推奨されます。

GitHub の「Merge pull request」ボタンは内部的に --no-ff 相当の動作をしており、マージコミットが必ず作られます。

bash
# マージは常に --no-ff(マージコミットを残す)
git config --global merge.ff false

# pull は ff のみ許可(diverge したら失敗させる)
git config --global pull.ff only

--squash マージ

--squash は、ブランチの全コミットを 1つの変更セットにまとめて ステージングする方法です。

マージコミットは作られず、通常のコミットとして記録します。

項目 --no-ff --squash
マージコミット 作られる 作られない(手動 commit)
元ブランチの履歴 全コミットが残る 1つにまとまる
git log 分岐・合流が見える 直線的(1コミット)
用途 通常のPRマージ 細かいWIPコミットを整理したい時

GitHub の「Squash and merge」ボタンがこの動作に相当します。

コミット履歴をきれいに保ちたいプロジェクトで好まれます。

bash
# feature ブランチの変更をまとめて取り込む
git merge --squash feature/login
git commit -m "feature/login の変更を統合"

コンフリクトが発生したら

コンフリクトマーカー(<<<<<<< / ======= / >>>>>>>)の読み方、VS Code を使った解消手順、よくあるパターンは、ガイド マージコンフリクトの解消方法 にまとめています。

解決が難しくなったときは git merge --abort でマージ前の状態に戻せます。

また、3-way マージ自体を避ける運用として「feature に main を取り込んでから main にマージする」方法があります。

詳しくは 3-way マージを避けるブランチ運用 を参照してください。

関連コマンド