並行作業を安全にする
テクノロジ系 / branch — ブランチ操作
並行作業を安全にする
— ブランチで変更を分離する —
このトピックが終わると
- ブランチが「なぜ必要か」説明できる
- ブランチを作成・切り替え・削除できる
- Fast-forward と 3-way マージの違いが分かる
git stashで作業を一時退避できるgit log --graphでブランチの状態を可視化できるmainを直接触らない理由が分かる
章 1 — ブランチがないと何が起きるか
ブランチなしで2人が作業すると
main ─────●─────●─────?
↑ ↑
Aさん Bさん
push push
↑
Aさんの変更が消える 💥後から push した人の変更が、
先に push した人の変更を上書きする。
もう一つの問題:途中経過が本番に混じる
main(本番稼働中) ↓ 直接作業 ↓ 「とりあえず commit」 ↓ バグを含む状態で push ↓ 本番が壊れる 💥
作業中のコードを本番と混ぜてはいけない。
章 2 — ブランチで解決する
ブランチ = 作業用の分岐
main(本番相当・直接触らない)
│
├─── feature/login ← Aさんの作業
│ ●──●──●
│
└─── feature/mypage ← Bさんの作業
●──●- それぞれ独立した空間で作業できる
mainは常に動く状態を保てる- 完成したら
mainにマージする
基本コマンド
# ブランチ一覧(* が現在のブランチ) git branch # ブランチを作って切り替える git switch -c feature/login # 既存のブランチに切り替える git switch main # ブランチを削除(マージ後) git branch -d feature/login
章 3 — マージ
マージ = ブランチを統合する
main ─────────────────●
↑ merge
feature ──●──●──●────────┘# main に切り替えてから git switch main # feature ブランチをマージ git merge feature/login
Fast-forward マージ
merge 前:
main ●
\
feature ●──●──●
merge 後:
main ●──●──●──● ← main が feature の先頭に追いつくmain に新しいコミットがない場合、
単純に main のポインタを前に進めるだけ。
3-way マージ
merge 前:
main ●──────●(mainにも変更がある)
\ \
feature ●──●──●
merge 後:
main ●──────●──────M ← マージコミット(M)が作られる
\ ↑
feature ●──●──●──────┘両方に変更がある場合、Git は共通の祖先を起点に
2つの変更を自動的に統合する。
→ 同じ行を変更していればコンフリクトになる(conflict トピック参照)
git log --graph でブランチを可視化する
git log --oneline --graph --all
* a3f1b2c (HEAD -> main) merge: feature/login をマージ |\ | * 9d8e7f6 (feature/login) feat: ログイン機能を追加 | * 3c2a1b0 fix: バリデーションを修正 |/ * 1a2b3c4 docs: README を追加
--all で全ブランチ、--graph で分岐・合流を視覚化。
ブランチが今どういう状態か迷ったらまずここを見る。
章 4 — 作業を中断する(git stash)
「途中で別の作業を頼まれた」問題
feature/login で作業中 ↓ 「本番のバグを今すぐ直して」 ↓ main に切り替えたい ↓ でも途中のファイルが未コミットで残っている
git switch main # error: Your local changes would be overwritten 💥
stash = 作業を一時退避する
作業ディレクトリ ──stash──→ 退避場所(スタック)
(未コミットの変更) ↓
あとで戻せる# 現在の変更を退避 git stash # 別ブランチで緊急対応... # 戻ってきたら復元 git stash pop
stash の基本コマンド
# 退避する(メッセージ付きで分かりやすく)
git stash push -m "ログイン機能の途中"
# 退避一覧を見る
git stash list
# stash@{0}: On feature/login: ログイン機能の途中
# stash@{1}: On feature/mypage: マイページの途中
# 最新の退避を復元して削除
git stash pop
# 特定の退避を復元
git stash apply stash@{1}stash を使う典型的な流れ
feature/login で作業中 ↓ git stash 作業を退避 ↓ git switch main git switch -c hotfix/bug 緊急修正ブランチを作成 ↓ 修正 → commit → merge ↓ git switch feature/login git stash pop 退避した作業を復元 ↓ feature の作業を再開
まとめ
git branch ブランチ一覧を見る git switch -c <name> ブランチを作って切り替える git switch <name> 既存ブランチに切り替える git merge <name> ブランチを現在のブランチに統合 git branch -d <name> マージ済みブランチを削除 git log --oneline --graph --all ブランチの状態を可視化 git stash 未コミットの変更を一時退避 git stash pop 退避した変更を復元
作業の流れ:
main から分岐 → 作業・commit → main にマージ → ブランチ削除
途中で割り込みが入ったら → git stash → 別ブランチで対応 → git stash pop
→ 次のトピック pr でレビューを挟む方法を学ぶ