メインコンテンツへスキップ
レッスン 5 / 15推定時間: 30

リベースの活用(git rebase)

履歴を整理してきれいなコミット履歴を作る方法と、対話的リベースでコミットを編集する技術を学びましょう

このレッスンの学習目標

  • リベースとマージの違いを理解する
  • 基本的なリベース操作をマスターする
  • 対話的リベースでコミット履歴を編集できる
  • リベースの危険性と適切な使用場面を理解する

リベースとは何か?

リベース(rebase)は、コミットを別のベースに移動させる操作です。ブランチの分岐点を変更することで、履歴を直線的に保つことができます。

マージとリベースの違い

マージの場合

      A---B---C feature
     /         \
D---E---F---G---H main

リベースの場合

              A'--B'--C' feature
             /
D---E---F---G main

なぜリベースを使うのか?

😵 履歴の複雑化

  • 「マージコミットだらけで履歴が追いにくい」
  • 「どの変更がどの機能に関連するか分からない」
  • 「git logがスパゲッティ状態」

🧹 クリーンな履歴の価値

  • プロジェクトの進化が理解しやすい
  • バグの原因を特定しやすい
  • コードレビューが容易

基本的なリベース

1. 単純なリベース

# featureブランチをmainの最新にリベース
git checkout feature/branch
git rebase main

2. リベース中のコンフリクト解決

# コンフリクトが発生した場合
# 1. コンフリクトを解決
# 2. 変更をステージング
git add resolved-file.js

# 3. リベースを続行
git rebase --continue

# またはリベースを中止
git rebase --abort

3. プッシュ時の注意

# リベース後は強制プッシュが必要
git push --force-with-lease origin feature/branch

# 通常の --force より安全
# 他の人の変更を誤って上書きしない

対話的リベース(Interactive Rebase)

対話的リベースを使うと、コミット履歴を自由に編集できます。

基本コマンド

# 最新3つのコミットを編集
git rebase -i HEAD~3

# 特定のコミットから編集
git rebase -i <commit-hash>

対話的リベースの操作

エディタが開き、以下のような内容が表示されます:

pick abc1234 Add user authentication
pick def5678 Fix login bug
pick ghi9012 Update documentation

# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# d, drop = remove commit

よく使う操作

1. コミットメッセージの修正(reword)

reword abc1234 Add user authentication
pick def5678 Fix login bug
pick ghi9012 Update documentation

2. コミットの統合(squash)

pick abc1234 Add user authentication
squash def5678 Fix login bug
pick ghi9012 Update documentation

3. コミットの順序変更

pick ghi9012 Update documentation
pick abc1234 Add user authentication
pick def5678 Fix login bug

4. コミットの削除(drop)

pick abc1234 Add user authentication
drop def5678 Fix login bug
pick ghi9012 Update documentation

リベースのベストプラクティス

1. ローカルブランチでのみ使用

# ✅ 良い: まだプッシュしていないコミット
git rebase -i HEAD~3

# ❌ 悪い: 既に共有されているブランチ
git checkout main
git rebase -i HEAD~10  # 危険!

2. featureブランチの定期的な更新

# mainの最新を取り込む
git checkout feature/branch
git fetch origin
git rebase origin/main

3. Pull時のリベース

# マージの代わりにリベースを使用
git pull --rebase origin main

# デフォルト設定にする
git config --global pull.rebase true

リベースの危険性と回避方法

黄金律:公開されたコミットをリベースしない

# ❌ 絶対にやってはいけない
git checkout main
git rebase feature/branch

# ❌ 共有ブランチでの履歴書き換え
git checkout develop
git rebase -i HEAD~20

リベースで問題が起きた時の対処

# リベース前の状態を確認
git reflog

# 特定の状態に戻る
git reset --hard HEAD@{5}

実践演習

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

リベース vs マージの使い分け

リベースを使うべき場合

状況理由
ローカルのfeatureブランチ履歴をクリーンに保てる
個人的な実験ブランチ自由に履歴を編集できる
Pull時の更新不要なマージコミットを避ける

マージを使うべき場合

状況理由
公開されたブランチ履歴の安定性を保つ
重要なマイルストーンマージの記録を残す
チーム共有ブランチ他のメンバーへの影響を避ける

まとめ

リベースは強力なツールですが、使い方を誤ると問題を引き起こします。基本的には:

  1. ローカルでのみ使用
  2. 公開前の整理に活用
  3. チームでルールを共有

これらを守れば、きれいで追跡しやすい履歴を維持できます。

次のレッスンでは、特定のコミットだけを別のブランチに適用する「チェリーピック」について学びます。

さらに学習を続けるには

素晴らしい学習ペースです!次のレッスンに進むには、無料会員登録をお願いします。無料会員では各コース3レッスンまで学習できます。

無料で続きを学ぶ

各コース3レッスンまで学習可能

学習進捗の自動保存

コース修了証明書の発行