git rebase入門:mergeとの違いから安全な使い方まで徹底解説

コマンドリファレンス

Gitを利用したチーム開発において、ブランチの統合やコミット履歴の整理で活躍するのが git rebase です。しかし、「履歴が書き換わるから怖い」「merge とどう違うの?」と疑問に思う方も多いでしょう。

本記事では、git rebase の基本的な使い方から、merge との違い、-i(インタラクティブ)オプションによるコミットのまとめ方、コンフリクトの解消手順、そしてチーム開発で絶対にやってはいけない注意点(安全な使い方)までを徹底解説します。

git rebase とは?

git rebase コマンドは、あるブランチの変更を別のブランチの先頭に付け替える(リベースする)ためのコマンドです。主に、作業ブランチの起点(ベース)を最新の状態に進めたり、コミット履歴をきれいに整理したりするために利用されます。

git rebase と git merge の違い

ブランチを統合するコマンドとして mergerebase がありますが、履歴の残り方に大きな違いがあります。

git merge(履歴をそのまま残す)

merge は、2つのブランチの履歴をそのまま残し、「マージコミット」を作成して合流させます。分岐や合流の事実が正確に記録されるため安全ですが、履歴が複雑(ブランチが入り組んだ状態)になりやすいデメリットがあります。

git rebase(履歴を直線的にする)

rebase は、現在のブランチのコミットを一つずつ取り出し、対象ブランチの最新のコミットの後ろに新しく付け直します。分岐がなかったかのような直線的で綺麗な履歴(コミット履歴の整頓)になる反面、元のコミットIDが書き換わる(別のコミットとして作成される)ため、扱いには注意が必要です。

【重要】git rebase の安全な使い方と絶対のルール

リベースにおける最大のルールは「すでにリモートリポジトリへPushし、他の人と共有しているブランチでは rebase を行わない」ことです。

公開済みのブランチを rebase して履歴を書き換えてしまうと、他の開発者のローカル環境にある履歴との間に矛盾が生じ、重大なトラブルを引き起こします。rebase は、あくまで「自分だけが作業しているローカルの作業ブランチ」に対してのみ行うようにしてください。

基本的な使い方:mainブランチの最新に追従する

作業中の機能ブランチ(feature)に、更新された main ブランチの最新の変更を取り込む場合の基本的な手順です。

git checkout feature
git rebase main

これにより、feature ブランチの起点が main ブランチの最新コミットに移動します。

コンフリクト(競合)発生時の解消法

rebase 中に変更内容が衝突し、コンフリクトが発生した場合は処理が一時停止します。以下の手順で解消します。

  1. コンフリクトが発生したファイルをエディタで開き、該当箇所を修正します。
  2. 修正後、git add で変更をステージングします。(※ git commit は不要です)
    git add <コンフリクトを修正したファイル>
  3. --continue オプションでリベースを再開します。
    git rebase --continue

※ もし rebase 自体を取りやめて元の状態に戻したい場合は、git rebase --abort を実行します。

git rebase -i でコミットをまとめる・整理する

-i(インタラクティブ)オプションを使うと、過去の複数のコミットを1つにまとめたり、コミットメッセージを変更したりと、柔軟なコミット履歴の整頓が可能です。Pull Requestを出す前に、「typo修正」などの細かなコミットをまとめる際によく使われます。

# 最新の3つのコミットを整理する
git rebase -i HEAD~3

エディタが起動し、以下のようなコミットの一覧が表示されます。

pick 1a2b3c4 Add new feature
pick 5d6e7f8 Fix typo in README
pick 9z8y7x6 Update configuration

コミットを直前のコミットにまとめるには、先頭の picksquash(または s)に変更します。

pick 1a2b3c4 Add new feature
squash 5d6e7f8 Fix typo in README
squash 9z8y7x6 Update configuration

保存してエディタを閉じると、新たにコミットメッセージを編集する画面が開くため、まとめた後のメッセージを入力して完了です。

主なオプション一覧

オプション説明使用例
<ブランチ名>指定ブランチに現在のブランチを付け替えgit rebase main
-i <ブランチ名またはコミット>インタラクティブリベース(コミット編集・統合・削除)git rebase -i HEAD~3
--onto <新ベース> <開始点> <ブランチ>特定の範囲を別のベースに付け替えgit rebase --onto main feature~2 feature
--continueコンフリクト解消後にリベースを続行git rebase --continue
--abortリベースを中止して元の状態に戻すgit rebase --abort
--skip問題のあるコミットをスキップgit rebase --skip

まとめ

git rebase は、コミット履歴を綺麗に保ち、プロジェクトの進行状況を見やすくするために欠かせない強力なコマンドです。merge との違いを理解し、共有ブランチでは絶対に使わないというルールを守りながら、日々の開発に役立ててください。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント