rebase|Git履歴を整える高度なマージ操作の理解と実践
rebase|Git履歴を整える高度なマージ操作の理解と実践
概要
rebase
はGitにおける履歴操作コマンドであり、あるブランチのベースを別のブランチに置き換えることで、履歴を直線的に整えることができます。
コードレビュー前後でよく使われますが、誤った使い方はチームの履歴に大きな混乱をもたらします。
rebaseは「内容を変えずに履歴だけをきれいにする」高度な履歴編集操作です。
基本構文と挙動
# mainブランチ上の変更をfeatureブランチに適用
git checkout feature/login
git fetch origin
git rebase origin/main
この操作により、featureブランチ上のコミットは main
の最新履歴を起点に再構築されます。
ブランチを「mainに追いつかせる」目的で使うのが一般的です。
mergeとの違いと使い分け
操作 | 履歴の形 | merge commit | コンフリクト解決 |
---|---|---|---|
merge |
履歴が枝分かれする | 発生する | 1回(まとめて) |
rebase |
履歴が直線になる | 発生しない | コミットごと |
履歴を分かりやすく保ちたい場合はrebase
、レビューや変更履歴の議論を明確に残したい場合はmerge
を選択します。
実務でのrebase活用シーン
- レビュー前に:
main
ブランチの最新状態に合わせて差分を明確化 - CIが落ちたときに:他PRの影響を受けている可能性がある場合に再基準化
- マージ戦略として:SquashマージやRebaseマージ戦略を使う際に事前rebaseを行う
会話例:rebase運用中のやりとり
Reviewer: mainが更新されたのでrebaseして差分整えてもらえますか?
Author: 了解です、rebaseしてforce-pushします。
Reviewer: 履歴が複雑になっていたのでrebaseして整理しました。レビューしやすくなったと思います。
注意点:force-pushとチーム履歴の汚染
rebase
は履歴を書き換えるため、pushには--force
が必要です。
これが原因で他メンバーの作業履歴と衝突することがあります。
git push --force-with-lease
rebase後のpushはレビューコメントが消えるなどの副作用もあるため、「rebaseしました」と一言コメントを添えることが推奨されます。
rebaseのトラブルと解決策
問題 | 解決策 |
---|---|
コンフリクトが複数回発生 | git rebase --abort でやり直す/--skip で無視も可能 |
rebase後に差分が不自然 | git log --graph で履歴を視覚確認し、誤rebaseを特定 |
コメントがGitHub上で消えた | force-push後はレビュアーに手動で通知する |
関連用語
merge
:ブランチ統合の基本操作。履歴を残すスタイルpush
:rebase後のforce-pushは慎重に扱う必要ありpull-request
:レビュー前のrebaseで差分を明確化可能
実務視点まとめ
rebaseは「見やすい履歴」を作るための強力なツールですが、慎重な使い方と明示的な運用ルールが欠かせません。
レビュー前に整える/force-push時に一言添える──それだけでチームの信頼とレビューの効率は大きく向上します。