ブランチを統合する - git merge
2つ以上の開発履歴を統合します。
概念図
構文
bash
git merge <branch>使用例
feature/loginブランチをマージ
bash
git merge feature/loginマージコミットを必ず作成
bash
git merge --no-ff feature/loginfast-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 マージを避けるブランチ運用 を参照してください。
Git Ready