コンテンツにスキップ

ブランチ戦略(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/○○ 各自が機能を作るときに使う作業用ブランチ

基本的な流れ:

  1. develop から自分の feature/○○ ブランチを作る
  2. feature/○○ で作業・コミットを重ねる
  3. 作業が終わったら 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を最新にする

git checkout develop
git pull origin develop

checkout とは

作業するブランチを切り替えるコマンドです。
git checkout developdevelop ブランチに移動します。


STEP 2:feature ブランチを作る

git checkout -b feature/自分の作業名

例:

git checkout -b feature/top-page-update

-b オプション

-b を付けると、新しいブランチを作りながら移動できます。
feature/ というプレフィックスを付けるのが慣習です。


STEP 3:作業してコミットする

ファイルを編集したら変更をステージングしてコミットします。

git add .
git commit -m "トップページのデザインを修正"
コマンド 意味
git add . 変更したファイルをすべてセーブ候補に入れる(ステージング)
git commit -m "メッセージ" セーブ(コミット)する。メッセージで何をしたか記録

コミットメッセージのコツ

「何をしたか」が分かるように書きましょう。
トップページのバナー画像を変更
修正 update (何を修正したか分からない)


STEP 4:develop の最新を取り込む(rebase)

プッシュ前に develop の最新変更を自分のブランチに取り込みます。

git fetch origin
git rebase origin/develop
コマンド 意味
git fetch origin GitHubの最新情報をダウンロードする(手元のファイルは変わらない)
git rebase origin/develop develop の最新の後ろに自分のコミットを移植する

コンフリクト(競合)が起きたら

同じファイルの同じ場所を別々に変更していると「コンフリクト」が発生します。
VSCode でコンフリクトしているファイルを開くと、どちらの変更を使うか選べます。
解決後は以下を実行してrebaseを続けます。

git add .
git rebase --continue

rebaseをやめたい場合は:

git rebase --abort

STEP 5:GitHubにプッシュする

git push origin feature/top-page-update

初回プッシュ後に rebase した場合

rebaseで履歴を書き換えた後は、通常の push ではエラーになることがあります。
その場合は --force-with-lease を使います。

git push --force-with-lease origin feature/top-page-update

--force は使わない

--force は他の人の変更を上書き消去する危険なオプションです。
代わりに --force-with-lease を使うと、意図しない上書きを防げます。


STEP 6:プルリクエストを出す

GitHubのリポジトリページを開いて:

  1. Compare & pull request ボタンをクリック
  2. basedevelopcompare を自分の feature/○○ に設定
  3. 変更内容の説明を書いて 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 にマージ

不明な点は気軽に代表(菅原)に相談してください!