GitHub Desktopで実践する「Squash merge」完全ガイド

— 授業・チーム運用にそのまま使える手順と運用ルール —

この記事で扱うこと

  • スクワッシュマージ(Squash merge)の狙いと注意点
  • GitHub Desktopだけで完結する2つのやり方
    1. ブランチ内の複数コミットを1つにまとめる
    2. 別ブランチをスクワッシュして現在のブランチへ取り込む
  • 授業・共同開発での運用ルール例よくある失敗の対処

なぜスクワッシュマージ?

  • PRの「WIP/typo 直し」等の細切れコミットを1コミットに集約して、履歴を機能単位で読みやすくするため。
  • 後でその機能一式を丸ごとrevertしやすい(1コミット分だけ戻せば良い)。
  • ただし細粒度の履歴はメイン履歴上からは見えなくなる点に注意(PR画面では追える)。

前提

  • 操作はすべて GitHub Desktop(Windows / macOS 共通UI)で完結します。
  • 機能そのものと具体メニュー名はGitHub公式ドキュメントに準拠しています。 

やり方①:ブランチ内のコミットをまとめる(Historyでのスクワッシュ)

「featureブランチで“WIP”や“fix”を重ねてしまった。PR前に1コミットへ整理したい」ケース。

  1. Current Branch から対象ブランチを選ぶ。
  2. 左サイドバーの History を開く。
  3. まとめたいコミットを Cmd/Ctrl や Shift で複数選択し、まとめ先のコミットへドラッグ&ドロップ
  4. 表示されるダイアログでメッセージを整え、Squash Commits を実行。
    • 途中でForce push が必要と出ることがある(公開済み履歴を書き換えるため)。
    • 対象にマージコミットが含まれると失敗する。
    • 未コミット変更がある場合はStash して継続する案内が出る。(以上の動作・エラーメッセージ仕様は公式Docsのとおり) 

ヒント:履歴の並べ替え(Reorder)も同じ History 画面でドラッグ&ドロップ対応。順序を整えてからSquashするとコミット物語が作りやすい。 


やり方②:他ブランチをスクワッシュして取り込む(メニュー操作)

「main に feature/xyz を1コミットで取り込みたい」ケース(PRなしローカル運用や教材用)。

  1. 取り込み先ブランチ(例:main)をチェックアウト。
  2. メニューバー Branch → Squash and Merge into Current Branch
  3. 取り込み元ブランチを選び、Squash and merge → 取り込み完了後に Push origin。(上記メニューと手順は公式Docsに明記) 

PR運用との関係

  • GitHub(Web)のPR画面でも “Squash and merge” を選べます。リポジトリ設定の Allow squash mergingを有効化しておくと良い。 

コミットメッセージ例(Conventional Commits)

  • Summary: feat: 敵AIの初期行動を追加
  • Description: 何を/なぜ/影響範囲。関連Issueやブレイキング変更があれば併記。
  • 共同作業者を残す場合は本文末にCo-authored-by: 氏名 <email>(PR本文に列挙しても可)

よくある失敗と対処

  • 「Force push が必要」通知→ 公開済みブランチの履歴を書き換えるため。共同作業なら事前告知の上、feature ブランチに対してのみ実施を推奨。 
  • 「マージコミットが含まれているためSquash失敗」→ その範囲を避けて分割してSquashする/先にReorderや再作業で解消。 
  • 未コミット変更がある→ 案内に従って Stash Changes and Continue。 

授業・チーム運用のおすすめルール

  • 原則:PRは “Squash and merge”(メイン履歴を1PR=1コミットで清潔に)。
  • 例外:低レイヤや障害解析用のリポジトリは通常マージで細粒度履歴を保持。
  • 事前整形:受講生はPR前に History → Squash でノイズコミットをまとめる。 
  • レビュー観点:Summaryは機能単位の要約、Descriptionで背景・副作用・テスト観点を明記。

参考:CLIで同等操作をするなら(知識補強)

# 1) 別ブランチをスクワッシュ取り込み(マージコミットは作らない)
git switch main
git fetch origin
git merge --squash origin/feature-xyz
git commit -m "feat: 〇〇機能を追加(概要…)"
git push origin main

# 2) ブランチ内のコミットをまとめる(対話的リベースの一例)
git switch feature-xyz
git rebase -i origin/main   # pick/squash/fixup を使う
git push -f origin feature-xyz  # 公開後は要注意

Desktopの手順と概念対応を理解するための補足です。実作業はDesktopで完結可。 

訪問数 4 回, 今日の訪問数 4回