ブランチ管理
この章では、ブランチの作成・削除・切り替えと、GitHubでのブランチ保護ルールの設定方法を学びます。
ブランチとは
Section titled “ブランチとは”**ブランチ(Branch)**は、開発の流れを分岐させる機能です。メインの開発ラインに影響を与えずに、新機能開発やバグ修正を行えます。
main ●────●────●────●────●────● │ ↑feature └──●──●──●────┘ マージブランチを使う理由
Section titled “ブランチを使う理由”- 並行開発: 複数の機能を同時に開発
- 安全な実験: 失敗してもmainに影響なし
- コードレビュー: PRでレビュー後にマージ
- リリース管理: 本番・開発・機能ごとに分離
ブランチの作成
Section titled “ブランチの作成”コマンドラインから
Section titled “コマンドラインから”# ブランチを作成git branch feature-login
# ブランチを作成して切り替えgit checkout -b feature-login
# Git 2.23以降の推奨コマンドgit switch -c feature-login
# 特定のコミットからブランチを作成git switch -c hotfix abc1234GitHub UIから
Section titled “GitHub UIから”- リポジトリページで「main」ドロップダウンをクリック
- 新しいブランチ名を入力
- 「Create branch: xxx from ‘main’」をクリック
ブランチの切り替え
Section titled “ブランチの切り替え”# ブランチを切り替えgit checkout feature-login
# Git 2.23以降の推奨コマンドgit switch feature-login
# 1つ前のブランチに戻るgit switch -ブランチの一覧と確認
Section titled “ブランチの一覧と確認”# ローカルブランチの一覧git branch
# リモートブランチも含むgit branch -a
# 現在のブランチを確認git branch --show-current
# 各ブランチの最新コミットgit branch -v
# マージ済みブランチgit branch --merged
# 未マージブランチgit branch --no-mergedブランチの削除
Section titled “ブランチの削除”ローカルブランチの削除
Section titled “ローカルブランチの削除”# マージ済みブランチを削除git branch -d feature-login
# 強制削除(未マージでも削除)git branch -D feature-login
# 複数ブランチを一括削除git branch -d branch1 branch2 branch3リモートブランチの削除
Section titled “リモートブランチの削除”# リモートブランチを削除git push origin --delete feature-login
# GitHub CLIgh pr close --delete-branch
# 古いリモート追跡ブランチを掃除git fetch --pruneGitHub UIから削除
Section titled “GitHub UIから削除”- Code → Branches
- 削除したいブランチの右側にあるゴミ箱アイコン
ブランチのマージ
Section titled “ブランチのマージ”基本的なマージ
Section titled “基本的なマージ”# mainブランチに切り替えgit switch main
# featureブランチをマージgit merge feature-loginマージの種類
Section titled “マージの種類”1. Fast-forward マージ
Section titled “1. Fast-forward マージ”mainが進んでいない場合、単純にポインタを移動:
Before:main ●────● │feature └──●──●
After:main ●────●──●──● ↑ featuregit merge feature-login# Fast-forward2. 3-way マージ
Section titled “2. 3-way マージ”mainも進んでいる場合、マージコミットを作成:
Before:main ●────●────● │feature └──●──●
After:main ●────●────●────●(マージコミット) │ │feature └──●──●───┘git merge feature-login# Merge made by the 'ort' strategy.3. Squash マージ
Section titled “3. Squash マージ”複数のコミットを1つにまとめてマージ:
git merge --squash feature-logingit commit -m "feature: ログイン機能を追加"マージの選択指針
Section titled “マージの選択指針”| 状況 | 推奨 |
|---|---|
| 単純な機能追加 | Fast-forward または Squash |
| 長期間の開発ブランチ | 3-way マージ |
| 細かいコミット履歴を残したくない | Squash |
デフォルトブランチの設定
Section titled “デフォルトブランチの設定”GitHubでの設定
Section titled “GitHubでの設定”- リポジトリの Settings
- General → Default branch
- 変更したいブランチを選択 → Update
ローカルの設定
Section titled “ローカルの設定”# 新規リポジトリのデフォルトブランチgit config --global init.defaultBranch mainブランチ保護ルール(基本)
Section titled “ブランチ保護ルール(基本)”ブランチ保護とは
Section titled “ブランチ保護とは”特定のブランチ(通常はmain)に対して、直接プッシュを禁止したり、PRを必須にしたりする設定です。
基本的な設定項目
Section titled “基本的な設定項目”| 設定 | 説明 |
|---|---|
| Require a pull request | 直接プッシュ禁止、PR必須 |
| Require approvals | レビュー承認が必要 |
| Require status checks | CIが通らないとマージ不可 |
| Require branches to be up to date | main と同期必須 |
- リポジトリの Settings
- Branches → Branch protection rules
- Add rule
Branch name pattern: mainブランチの同期
Section titled “ブランチの同期”リモートの変更を取り込む
Section titled “リモートの変更を取り込む”# 現在のブランチにリモートの変更をマージgit pull origin main
# リベースで取り込むgit pull --rebase origin main他のブランチの変更を取り込む
Section titled “他のブランチの変更を取り込む”# featureブランチにいる状態で# mainの最新を取り込む
# マージで取り込むgit merge main
# リベースで取り込む(履歴がきれいになる)git rebase mainリベース vs マージ
Section titled “リベース vs マージ”マージ:main ●────●────●────────● │ ↑マージコミットfeature └──●──●────────┘
リベース:main ●────●────● │feature └──●'──●'(コミットが付け替えられる)| 方法 | メリット | デメリット |
|---|---|---|
| マージ | 履歴が正確、安全 | マージコミットで履歴が複雑 |
| リベース | 履歴がきれい | プッシュ済みブランチでは危険 |
中級者向けTips
Section titled “中級者向けTips”ブランチの追跡設定
Section titled “ブランチの追跡設定”# 上流ブランチを設定git branch --set-upstream-to=origin/feature feature
# またはgit push -u origin featureブランチ名の変更
Section titled “ブランチ名の変更”# ローカルブランチの名前を変更git branch -m old-name new-name
# 現在のブランチの名前を変更git branch -m new-name
# リモートに反映(旧ブランチ削除+新ブランチプッシュ)git push origin :old-name new-namegit push -u origin new-nameCherry-pick
Section titled “Cherry-pick”特定のコミットだけを取り込む:
# 特定のコミットを現在のブランチに適用git cherry-pick abc1234
# 複数のコミットgit cherry-pick abc1234 def5678
# コミットせずに変更だけ適用git cherry-pick -n abc1234ブランチの比較
Section titled “ブランチの比較”# 2つのブランチの差分git diff main..feature
# コミット数の差分git rev-list --count main..feature
# 共通の祖先からの差分git diff main...featureWorktree(複数ブランチを同時に作業)
Section titled “Worktree(複数ブランチを同時に作業)”# 別ディレクトリで別ブランチをチェックアウトgit worktree add ../project-feature feature-branch
# worktreeの一覧git worktree list
# 削除git worktree remove ../project-feature| 操作 | コマンド |
|---|---|
| ブランチ作成 | git switch -c <name> |
| ブランチ切り替え | git switch <name> |
| ブランチ一覧 | git branch -a |
| ブランチ削除 | git branch -d <name> |
| マージ | git merge <name> |
| リベース | git rebase <name> |
ベストプラクティス
Section titled “ベストプラクティス”- mainブランチを保護: 直接プッシュを禁止
- 小さなブランチ: 1つの機能につき1ブランチ
- こまめにマージ: 長期間分岐しない
- 命名規則を決める:
feature/,fix/,hotfix/など
次の章では、プルリクエスト(PR)の作成方法を学びます。
Q1. ブランチを作成して同時に切り替えるコマンドはどれですか?(Git 2.23以降)
Q2. Fast-forwardマージが発生する条件はどれですか?
Q3. リベース(rebase)の注意点として正しいものはどれですか?