採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

並行作業を安全にする

テクノロジ系 / 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 でレビューを挟む方法を学ぶ