C
コラボレーション & Git/ブランチ/Lesson 03

ブランチ — Branch · Merge · Rebase · Conflict · Stash

45分·theory

ブランチ — Branch · Merge · Rebase · Conflict · Stash

🎯 このlessonを読み終えたら

このlessonを読み終えると、以下の3つを自信を持って実践できるようになります。

  • ✅ Git Flow vs Trunk-based Development
  • ✅ rebaseとmergeの違い + 使いどころ
  • ✅ Squash merge + コミット整理

学習目標をチェックリストとして持ち、すべて答えられるようになったらlessonを閉じてください。

ブランチ作業フロー 6ステップ

1. 作成git checkout -b feature/login (mainから分岐)
2. 作業・コミット — コード編集 + git commit. mainに影響なし
3. pushgit push -u origin feature/login — リモートにトラッキングブランチを作成
4. PR作成 — GitHubでPull Requestを作成。レビュー依頼
5. 承認 → マージ — レビュー通過 + CI通過 → mainにマージ
6. ブランチ削除 — マージ後は不要。git branch -d またはGitHub UI

> 💡 ブランチ = 並行宇宙。mainは本番コード、featureは実験コード。実験が失敗しても、ブランチを捨てるだけで済みます。

Merge vs Rebase — 2つの統合方式

Mergegit merge feature でmainに統合

  • 結果: Merge Commit が新たに作成される。分岐の痕跡が残る
  • メリット: 安全。元のコミットが保存される
  • デメリット: 履歴が複雑になる(ダイヤモンド形)

Rebasegit rebase main でfeatureをmainの上に移動

  • 結果: 線形な履歴。すっきりする
  • メリット: 可読性向上。一本のタイムライン
  • デメリット: コミットハッシュが再生成される。push済みブランチには危険

どちらをいつ使う?

状況選択
共有ブランチMerge (安全)
ローカルのfeatureブランチRebase (整理)
mainへの統合チームのポリシーに従う
push後絶対にRebase禁止

コンフリクト解消の4つのオプション

同じ行を別々に変更した場合 → Gitがコンフリクトマーカーを挿入:

code
<<<<<<< HEAD
自分の変更
=======
相手の変更
>>>>>>> feature

解消方法:
1. 自分のものを選択 (Accept Current) — 上のコードのみ残し、マーカーと下を削除
2. 相手のものを選択 (Accept Incoming) — 下のコードのみ残し、マーカーと上を削除
3. 両方残す (Accept Both) — 両側を保持し、マーカーのみ削除
4. 新規作成 — 両方を無視して新たに書く(どちらも不十分な場合に最もよく使われる)

解消後:

bash
git add <コンフリクトしたファイル>
git commit                    # mergeメッセージが自動生成される
# または中断する場合:
git merge --abort             # 元の状態に戻す

> 💡 IDE推奨: VS CodeとIntelliJにはコンフリクト解消GUIが内蔵されています。'Accept Both'ボタンが最も安全です。

Git Stash — 作業の一時引き出し

シナリオ: feature/loginの作業中に本番バグ発生 → 今すぐ修正が必要

解決手順:

bash
git stash push -m "WIP ログイン"  # 1. 作業ツリーをきれいにして引き出しに保存
git checkout main                # 2. mainに移動
git checkout -b hotfix/critical  # 3. hotfixブランチ作成 + 修正 + マージ + デプロイ
git checkout feature/login       # 4. 元のブランチに戻る
git stash pop                    # 5. 引き出しから取り出して作業ツリーに復元

その他のコマンド:

  • git stash list — 引き出しの一覧を確認
  • git stash show -p — 変更内容をプレビュー
  • git stash drop — 引き出しを空にする(復元不可)
  • git stash apply — popと同じだが、引き出しにエントリを残す

> ⚠️ stashが溜まりすぎると忘れてしまいます。使用後すぐにpopするか、commitで整理することを推奨します。

💻 📌 ブランチコマンド cheatsheet
# === ブランチ作成・移動 ===
git branch                          # ローカルブランチリスト
git branch -a                       # リモート含む全体
git checkout -b feature/x           # 新しいブランチ作成 + 移動
git switch -c feature/x             # 同一 (モダンコマンド)
git checkout main                   # 移動のみ
git branch -d feature/x             # ブランチ削除 (マージされたもののみ)
git branch -D feature/x             # 強制削除

# === マージ ===
git merge feature/x                 # main に feature をマージ (マージコミット作成)
git merge --no-ff feature/x         # 無条件でマージコミット作成
git merge --abort                   # 衝突時にマージ取り消し

# === リベース ===
git rebase main                     # feature を main の上に (線形)
git rebase --continue               # 衝突解決後も続行
git rebase --abort                  # 元に戻す
git rebase -i HEAD~3                # 最近の3コミットを対話的に整理

# === Stash (一時保存) ===
git stash push -m "WIP"             # 変更事項を棚に保管
git stash list                      # 棚リスト
git stash pop                       # 最新の棚 → 作業ツリー (棚から削除)
git stash apply stash@{1}           # 特定の棚を適用 (棚は維持)
git stash drop stash@{0}            # 棚を削除

# === リモートブランチ ===
git push -u origin feature/x        # 初回プッシュ、追跡設定
git push origin --delete feature/x  # リモートブランチ削除
git fetch --prune                   # 消えたリモートブランチを整理

🤖 AIへの依頼例

このlessonの概念を知っていると、AIに具体的に指示できます。漠然とした「直して」ではなく、語彙を持ったリクエスト — それがトークン節約の出発点です。

  • 「このhotfixをmainにマージするための安全なgit revert手順を教えて」
  • 「このfeatureブランチのコミットをsquash + rebaseで整理して」

なぜこれでトークンが減るのか

概念を知らないと、AIの回答を受け取っても「それってどういう意味ですか?」とまた聞き直すことになります。その「聞き直し」がトークンを消費します。概念を一度習得しておけば、会話が一度で終わります

ブランチ — Branch · Merge · Rebase · Conflict · Stash - コラボレーション & Git