コンテンツにスキップ

ブランチ管理

この章では、ブランチの作成・削除・切り替えと、GitHubでのブランチ保護ルールの設定方法を学びます。

**ブランチ(Branch)**は、開発の流れを分岐させる機能です。メインの開発ラインに影響を与えずに、新機能開発やバグ修正を行えます。

main ●────●────●────●────●────●
│ ↑
feature └──●──●──●────┘
マージ
  1. 並行開発: 複数の機能を同時に開発
  2. 安全な実験: 失敗してもmainに影響なし
  3. コードレビュー: PRでレビュー後にマージ
  4. リリース管理: 本番・開発・機能ごとに分離
Terminal window
# ブランチを作成
git branch feature-login
# ブランチを作成して切り替え
git checkout -b feature-login
# Git 2.23以降の推奨コマンド
git switch -c feature-login
# 特定のコミットからブランチを作成
git switch -c hotfix abc1234
  1. リポジトリページで「main」ドロップダウンをクリック
  2. 新しいブランチ名を入力
  3. 「Create branch: xxx from ‘main’」をクリック
Terminal window
# ブランチを切り替え
git checkout feature-login
# Git 2.23以降の推奨コマンド
git switch feature-login
# 1つ前のブランチに戻る
git switch -
Terminal window
# ローカルブランチの一覧
git branch
# リモートブランチも含む
git branch -a
# 現在のブランチを確認
git branch --show-current
# 各ブランチの最新コミット
git branch -v
# マージ済みブランチ
git branch --merged
# 未マージブランチ
git branch --no-merged
Terminal window
# マージ済みブランチを削除
git branch -d feature-login
# 強制削除(未マージでも削除)
git branch -D feature-login
# 複数ブランチを一括削除
git branch -d branch1 branch2 branch3
Terminal window
# リモートブランチを削除
git push origin --delete feature-login
# GitHub CLI
gh pr close --delete-branch
# 古いリモート追跡ブランチを掃除
git fetch --prune
  1. Code → Branches
  2. 削除したいブランチの右側にあるゴミ箱アイコン
Terminal window
# mainブランチに切り替え
git switch main
# featureブランチをマージ
git merge feature-login

mainが進んでいない場合、単純にポインタを移動:

Before:
main ●────●
feature └──●──●
After:
main ●────●──●──●
feature
Terminal window
git merge feature-login
# Fast-forward

mainも進んでいる場合、マージコミットを作成:

Before:
main ●────●────●
feature └──●──●
After:
main ●────●────●────●(マージコミット)
│ │
feature └──●──●───┘
Terminal window
git merge feature-login
# Merge made by the 'ort' strategy.

複数のコミットを1つにまとめてマージ:

Terminal window
git merge --squash feature-login
git commit -m "feature: ログイン機能を追加"
状況推奨
単純な機能追加Fast-forward または Squash
長期間の開発ブランチ3-way マージ
細かいコミット履歴を残したくないSquash
  1. リポジトリの Settings
  2. GeneralDefault branch
  3. 変更したいブランチを選択 → Update
Terminal window
# 新規リポジトリのデフォルトブランチ
git config --global init.defaultBranch main

特定のブランチ(通常はmain)に対して、直接プッシュを禁止したり、PRを必須にしたりする設定です。

設定説明
Require a pull request直接プッシュ禁止、PR必須
Require approvalsレビュー承認が必要
Require status checksCIが通らないとマージ不可
Require branches to be up to datemain と同期必須
  1. リポジトリの Settings
  2. BranchesBranch protection rules
  3. Add rule
Branch name pattern: main
Terminal window
# 現在のブランチにリモートの変更をマージ
git pull origin main
# リベースで取り込む
git pull --rebase origin main

他のブランチの変更を取り込む

Section titled “他のブランチの変更を取り込む”
Terminal window
# featureブランチにいる状態で
# mainの最新を取り込む
# マージで取り込む
git merge main
# リベースで取り込む(履歴がきれいになる)
git rebase main
マージ:
main ●────●────●────────●
│ ↑マージコミット
feature └──●──●────────┘
リベース:
main ●────●────●
feature └──●'──●'(コミットが付け替えられる)
方法メリットデメリット
マージ履歴が正確、安全マージコミットで履歴が複雑
リベース履歴がきれいプッシュ済みブランチでは危険

Terminal window
# 上流ブランチを設定
git branch --set-upstream-to=origin/feature feature
# または
git push -u origin feature
Terminal window
# ローカルブランチの名前を変更
git branch -m old-name new-name
# 現在のブランチの名前を変更
git branch -m new-name
# リモートに反映(旧ブランチ削除+新ブランチプッシュ)
git push origin :old-name new-name
git push -u origin new-name

特定のコミットだけを取り込む:

Terminal window
# 特定のコミットを現在のブランチに適用
git cherry-pick abc1234
# 複数のコミット
git cherry-pick abc1234 def5678
# コミットせずに変更だけ適用
git cherry-pick -n abc1234
Terminal window
# 2つのブランチの差分
git diff main..feature
# コミット数の差分
git rev-list --count main..feature
# 共通の祖先からの差分
git diff main...feature

Worktree(複数ブランチを同時に作業)

Section titled “Worktree(複数ブランチを同時に作業)”
Terminal window
# 別ディレクトリで別ブランチをチェックアウト
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>
  1. mainブランチを保護: 直接プッシュを禁止
  2. 小さなブランチ: 1つの機能につき1ブランチ
  3. こまめにマージ: 長期間分岐しない
  4. 命名規則を決める: feature/, fix/, hotfix/ など

次の章では、プルリクエスト(PR)の作成方法を学びます。

Q1. ブランチを作成して同時に切り替えるコマンドはどれですか?(Git 2.23以降)

Q2. Fast-forwardマージが発生する条件はどれですか?

Q3. リベース(rebase)の注意点として正しいものはどれですか?