Dev Study
← 解説「マージとその後 — 取り込みと後片付けまでが仕事」に戻る

サンプルコードで身につける: マージとその後 — 取り込みと後片付けまでが仕事

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1マージ前の最終確認 — CIと承認の状態を見る

マージの条件は「CI がすべて緑」と「必要な承認が揃っている」の2つです。gh pr checks と gh pr view で両方をターミナルから確認できます。多くのチームではブランチ保護設定により、条件が揃うまでマージボタン自体が押せません。

# 1. CI の状態を確認(すべて pass になっているか)
gh pr checks
# => build   pass   1m18s
#    test    pass   2m02s
#    lint    pass   0m41s

# 2. レビューの承認状況を確認
gh pr view
# => title:     ユーザー一覧に検索ボックスを追加
#    reviewers: tanaka (Approved)
#    state:     OPEN

# 3. 未解決のレビュースレッドが残っていないかも見ておく
#    (返信していないコメントを残したままマージしない)

# 多くのチームはブランチ保護ルールで
# 「承認1件以上 + CI 緑」を満たすまでマージ不可に設定している

2squashマージ — PRを1コミットにまとめて取り込む

squash マージは、PR 内の細かいコミットを1つにまとめて main に積む方式です。レビュー対応や typo 修正のコミットが main の履歴に残らず、「1 PR = 1 コミット」の読みやすい履歴になります。多くのチームが既定にしている方式です。

# squash マージを実行(リモートブランチの削除も同時に)
gh pr merge --squash --delete-branch

# ── squash マージで起きること ──
#
# PR 内のコミット(作業の過程がそのまま残っている):
#   ・検索ボックスの骨組みを追加
#   ・typo 修正
#   ・レビュー指摘: 変数名を修正
#   ・レビュー指摘: computed に変更
#
#        ↓ squash(1つに押しつぶす)
#
# main に積まれるコミット(1つだけ):
#   ・ユーザー一覧に検索ボックスを追加 (#45)
#
# → main の履歴が「1 PR = 1 コミット」になり、後から読みやすい

3マージ後の後片付け — ブランチ削除と次の準備

マージされたブランチは役目を終えるので、リモートと手元の両方から削除します。そして手元の main を pull で最新にしてから次のブランチを切ります。この後片付けを怠ると、古いブランチが溜まり、古い main から作業を始める事故が起きます。

# ── マージ後の後片付けルーティン ──

# 1. main に切り替えて最新を取り込む(マージされた自分の変更が入る)
git switch main
git pull

# 2. 役目を終えた手元のブランチを削除
git branch -d feature/user-search
#   ※ リモート側は gh pr merge --delete-branch や
#     GitHub の自動削除設定で消えていることが多い

# 3. リモートで消えたブランチの残骸を手元からも掃除
git fetch --prune

# 4. 最新の main から次の作業ブランチを切る
git switch -c feature/next-work

# この 1〜4 を毎回のマージ後に回すのが日々のリズムになる

4コンフリクトが出たら — mainを取り込んで解消する

他の PR が先にマージされ、自分の PR と同じ箇所を変更していると、マージできない(コンフリクト)状態になります。基本手順は、最新の main を自分のブランチに取り込み、衝突箇所を手で直してコミットし、push するだけです。

# PR 画面に「This branch has conflicts」と出たときの基本手順

# 1. 最新の main を取得して、自分のブランチに取り込む
git fetch origin
git switch feature/user-search
git merge origin/main
# => CONFLICT (content): Merge conflict in src/app/user-list/user-list.ts

# 2. 衝突したファイルを開くと、両方の変更が印付きで並んでいる
#    <<<<<<< HEAD          … 自分のブランチの内容
#    =======
#    >>>>>>> origin/main   … main 側の内容
#    → 印を消しながら「正しい最終形」に手で直す

# 3. 直したファイルをコミットして push すれば PR も解消される
git add src/app/user-list/user-list.ts
git commit    # マージコミットのメッセージは既定のままでよい
git push

5マージ方式は3種類 — チームの既定に従う

GitHub のマージには merge commit・squash・rebase の3方式があり、main の履歴の残り方が変わります。どれを使うかはリポジトリ設定でチームが決めていることが多いので、まず自チームの既定を確認しましょう。

# ── GitHub の3つのマージ方式と履歴の残り方 ──

# 1. merge commit(gh pr merge --merge)
#    PR の全コミット + マージコミットがそのまま main に残る
#    → 作業過程を全部残したいチーム向け。履歴は枝分かれして複雑

# 2. squash(gh pr merge --squash)
#    PR 全体を1コミットに押しつぶして main に積む
#    → 「1 PR = 1 コミット」で履歴が一直線。採用チームが多い

# 3. rebase(gh pr merge --rebase)
#    PR の各コミットを main の先頭に並べ直して積む
#    → コミット単位の履歴を残しつつ一直線にしたいチーム向け

# どの方式が使えるかはリポジトリの Settings で制限されている
# ことが多い。迷ったらチームの既定・慣習に従うのが正解