ブランチ戦略(rebase運用)¶
このプロジェクトでは rebase を使ったブランチ戦略を採用しています。
「ブランチって何?」「mergeとrebaseの違いは?」という疑問をひとつひとつ解消しながら説明します。
ブランチとは?¶
Gitには「ブランチ(branch)」という概念があります。
ブランチとは作業のラインを分岐させる仕組みです。
たとえば、複数人で本を書くとき、全員が同じ原稿を直接書き換えると混乱しますよね。
ブランチを使うと、それぞれが「自分用のコピー」で作業し、あとでまとめることができます。
gitGraph
commit id: "最初のコミット"
commit id: "ベースの変更"
branch "feature/ログイン"
checkout "feature/ログイン"
commit id: "ログイン画面を追加"
commit id: "バリデーション追加"
checkout main
commit id: "別の修正"
コミットとは
ファイルの変更を「セーブ」する操作です。ゲームのセーブポイントのようなものです。
コミットを積み重ねることで、変更の歴史が作られます。
ブランチの種類(このプロジェクトの運用)¶
| ブランチ名 | 役割 |
|---|---|
main |
本番公開中の安定版。直接変更しない |
develop |
開発の中心。全員がここに向けて作業する |
feature/○○ |
各自が機能を作るときに使う作業用ブランチ |
基本的な流れ:
developから自分のfeature/○○ブランチを作るfeature/○○で作業・コミットを重ねる- 作業が終わったら
developに取り込んでもらう(プルリクエスト)
mergeとは?¶
merge(マージ) は、2つのブランチの変更を合流させる操作です。
gitGraph
commit id: "A"
commit id: "B"
branch feature
checkout feature
commit id: "C(機能追加)"
commit id: "D(仕上げ)"
checkout main
commit id: "E(別の修正)"
merge feature id: "F(マージコミット)"
mergeを使うと、「F(マージコミット)」という合流点のコミットが自動で作られます。
歴史がそのまま残るため「いつ何をマージしたか」が分かりやすい反面、
コミット履歴が複雑な形(Y字型)になっていきます。
rebaseとは?¶
rebase(リベース) は、自分のブランチの出発点を「最新の地点」に付け替える操作です。
merge との比較¶
gitGraph
commit id: "A"
commit id: "B"
branch feature
checkout feature
commit id: "C"
commit id: "D"
checkout main
commit id: "E"
merge feature id: "F(マージコミット)"
合流点(F)が作られ、履歴がY字型になります。
gitGraph
commit id: "A"
commit id: "B"
commit id: "E"
commit id: "C-prime(Cを移植)"
commit id: "D-prime(Dを移植)"
feature のコミット(C・D)が main の最新(E)の後ろに移植されます。
履歴が一直線になり、すっきり読みやすくなります。
イメージで理解する¶
電車の乗り換えで例えると
- merge :2つの電車が「合流駅」で一緒になる(Y字型)
- rebase :自分の電車を止めて、別の電車の「最後尾に連結」する(一直線)
このプロジェクトでの rebase 運用手順¶
基本的な作業の流れ¶
1. developブランチを最新にする
2. feature ブランチを作って作業する
3. プッシュ前に develop の最新を取り込む(rebase)
4. GitHub にプッシュしてプルリクエストを出す
STEP 1:developを最新にする¶
checkout とは
作業するブランチを切り替えるコマンドです。
git checkout develop で develop ブランチに移動します。
STEP 2:feature ブランチを作る¶
例:
-b オプション
-b を付けると、新しいブランチを作りながら移動できます。
feature/ というプレフィックスを付けるのが慣習です。
STEP 3:作業してコミットする¶
ファイルを編集したら変更をステージングしてコミットします。
| コマンド | 意味 |
|---|---|
git add . |
変更したファイルをすべてセーブ候補に入れる(ステージング) |
git commit -m "メッセージ" |
セーブ(コミット)する。メッセージで何をしたか記録 |
コミットメッセージのコツ
「何をしたか」が分かるように書きましょう。
✅ トップページのバナー画像を変更
❌ 修正 update (何を修正したか分からない)
STEP 4:develop の最新を取り込む(rebase)¶
プッシュ前に develop の最新変更を自分のブランチに取り込みます。
| コマンド | 意味 |
|---|---|
git fetch origin |
GitHubの最新情報をダウンロードする(手元のファイルは変わらない) |
git rebase origin/develop |
develop の最新の後ろに自分のコミットを移植する |
コンフリクト(競合)が起きたら
同じファイルの同じ場所を別々に変更していると「コンフリクト」が発生します。
VSCode でコンフリクトしているファイルを開くと、どちらの変更を使うか選べます。
解決後は以下を実行してrebaseを続けます。
rebaseをやめたい場合は:
STEP 5:GitHubにプッシュする¶
初回プッシュ後に rebase した場合
rebaseで履歴を書き換えた後は、通常の push ではエラーになることがあります。
その場合は --force-with-lease を使います。
--force は使わない
--force は他の人の変更を上書き消去する危険なオプションです。
代わりに --force-with-lease を使うと、意図しない上書きを防げます。
STEP 6:プルリクエストを出す¶
GitHubのリポジトリページを開いて:
- Compare & pull request ボタンをクリック
baseをdevelop、compareを自分のfeature/○○に設定- 変更内容の説明を書いて Create pull request
よく使うGitコマンド一覧¶
状態を確認する¶
# 現在のブランチと変更状況を確認
git status
# コミット履歴を一覧表示(一行で見やすく)
git log --oneline --graph --all
# 今どのブランチにいるか確認
git branch
ブランチ操作¶
# ブランチ一覧を表示(GitHub上のものも含む)
git branch -a
# ブランチを移動
git checkout ブランチ名
# ブランチを作って移動
git checkout -b 新しいブランチ名
# ブランチを削除(マージ済みのもの)
git branch -d ブランチ名
変更の取り消し¶
# まだコミットしていない変更を元に戻す(ファイル指定)
git restore ファイル名
# 直前のコミットのメッセージを修正する
git commit --amend -m "修正したメッセージ"
# コミットを取り消してファイルの変更は残す
git reset --soft HEAD~1
git reset --hard は注意
git reset --hard はコミットも変更も完全に消去します。
初心者の方は基本的に使わないようにしましょう。
リモート(GitHub)との同期¶
# GitHubの最新情報を取得(ファイルは変わらない)
git fetch origin
# GitHubの最新を取得してブランチに反映(fetch + merge)
git pull origin develop
# ローカルの変更をGitHubに送る
git push origin ブランチ名
作業フローのまとめ図¶
flowchart TD
A["developを最新にする<br/>git pull origin develop"] --> B["featureブランチを作成<br/>git checkout -b feature/xx"]
B --> C[ファイルを編集]
C --> D["ステージング<br/>git add ."]
D --> E["コミット<br/>git commit -m メッセージ"]
E --> F{もっと作業がある?}
F -- Yes --> C
F -- No --> G["developの最新を取り込む<br/>git fetch origin<br/>git rebase origin/develop"]
G --> H{コンフリクトあり?}
H -- Yes --> I["VSCodeでコンフリクト解消<br/>git add .<br/>git rebase --continue"]
I --> G
H -- No --> J["GitHubにプッシュ<br/>git push origin feature/xx"]
J --> K[プルリクエストを作成]
K --> L[developにマージされる!]
まとめ¶
| 項目 | 内容 |
|---|---|
| merge | 合流点(マージコミット)を作ってブランチを統合。履歴はY字型 |
| rebase | 自分のコミットを最新地点に移植。履歴が一直線になる |
| このプロジェクトの方針 | feature/○○ → rebase → プルリクエスト → develop にマージ |
不明な点は気軽に代表(菅原)に相談してください!