1. ホーム
  2. 記事一覧
  3. git rebaseとは?コミット履歴を整理する基本から応用まで解説!

2025.07.28

git rebaseとは?コミット履歴を整理する基本から応用まで解説!

    はじめに

    Gitの操作に慣れてくると、「過去のコミットを整理したい」「履歴をもっと見やすくしたい」と思う場面が増えてきます。そんなときに役立つのが git rebase コマンドです。

    git rebase は、ブランチの履歴を付け替えて直線的に並べ直すことで、履歴をきれいに整理できる便利な機能です。一方で、使い方を誤るとコンフリクトや履歴の不整合を引き起こすこともあり、正しく理解して使うことが大切です。

    この記事では、git rebase の基本から、インタラクティブリベースやコンフリクト発生時の対応方法まで、初心者でも無理なく理解できるように段階的に解説していきます。実際の手を動かすハンズオンも交えながら、Gitの履歴操作に自信が持てるようになることを目指します。

    Gitについての基本

    Gitは、ファイルの変更履歴を管理するバージョン管理ツールです。個人の作業でもチーム開発でも、「誰が・いつ・何を」変更したのかを記録でき、安心して作業が進められます。

    Gitの基本をさらに知りたい方は、以下の記事も参考にしてください。

    ▼Gitを基礎から学びたい方はこちら

    【初心者向け】GitHubとは?必須知識と使い方について解説!

    https://envader.plus/article/68

    ▼Gitコマンド早見表はこちら

    必見!現場で役立つGitコマンド29選をまとめて紹介!

    https://envader.plus/article/402

    git rebaseとは

    git rebase は、ブランチの履歴を付け替え付け直しするためのコマンドです。ブランチの履歴を整理し、より直線的で分かりやすい履歴にします。

    具体的には、今作業しているブランチのベース(基点)を別のブランチの最新状態に変更します。これにより、履歴が直線的に並び、マージコミットが不要になります。

    たとえば以下のようなブランチのコミット履歴があったとします。

    feature ブランチに対して main ブランチを rebase します。

    # mainブランチをrebaseする
    git rebase main

    すると、次のように履歴が付け替わります。

    DE のコミットが、C の後ろに移動したイメージです。このとき、DE は別のコミットとして新たに作られたものなので、ハッシュ値が変わっています。

    rebaseの主な使用場面

    git rebase は、次のような場面でよく使われます。

    • 履歴をきれいにしたいとき

      チーム開発では、main ブランチで他のメンバーが新しいコミットを追加していると、自分の作業ブランチが古い状態のままになることがあります。このようなときに git rebase を使うと、履歴をスッキリとまとめることができます。

    • マージコミットを避けたいとき

      git merge を使って main などのブランチを取り込むと、マージコミットが自動で作成されます。開発中に何度もマージを繰り返すと、履歴が複雑になってしまうことがあります。このような場面でgit rebase を使えば、履歴に整えることができます。

    • レビューやプルリクエスト前の整理

      作業中に細かく分けてコミットしていた場合は、git rebase -i を使って不要なコミットを削除したり、関連するものをまとめたりできます。プルリクエストの前に履歴を整えておくと、レビューもしやすくなり、意図が伝わりやすい履歴になります。

    git rebaseの注意点

    git rebase は履歴を書き換える操作のため、リモートリポジトリに push 済みのブランチに対して使うのは基本的に避けましょう。チームメンバーと共有しているブランチで rebase を使うと、他の人の履歴と衝突し、コンフリクトや整合性の問題を引き起こす原因になります。

    安全に使えるのは、次のようなケースです。

    • 自分だけが使っているローカルブランチ
    • プルリクエスト提出前の履歴整理

    どうしてもリモートブランチに対して rebase を使いたい場合は、事前にチームメンバーと相談し、全員が状況を把握してからの使用をおすすめします。

    git rebaseとgit mergeの違い

    git rebasegit merge は、Gitでブランチを統合する際によく比較される2つのコマンドです。どちらも同じ目的を果たしますが、履歴の扱い方に違いがあります。

    • git rebase

      履歴を付け直して直線的に並び替えることで、スッキリした履歴を作れます。履歴を整理したい場面に向いています。

    • git merge

      ブランチの履歴をそのまま残しながら統合し、マージコミットを作成します。並行作業の流れを保ちたいときに便利です。

    以下のように使い分けられることが一般的です。

    利用目的適したコマンド
    履歴をきれいに整理したいgit rebase
    履歴の流れを明示したいgit merge

    2つのコマンドの比較イメージ

    git rebaseの使い方

    git rebase の基本的な使い方は、取り込みたいブランチを以下のように指定します。

    git rebase <ブランチ名>

    このコマンドは、現在のブランチの変更履歴を、指定したブランチの最新履歴の上に付け直すという意味になります。たとえば、最新の main ブランチの履歴の上に、作業中の feature ブランチの変更履歴を付け直してみます。

    まずは、main の最新の状態をリモートリポジトリから取得します。

    git fetch origin

    次に、作業ブランチ feature/1 に切り替えます。

    git switch feature/1

    そして、取得した origin/main の履歴の上に、現在のブランチの履歴を付け替えます。

    git rebase origin/main

    この操作により、feature/1 ブランチの履歴は origin/main の直後に並ぶ形に変更され、履歴が1本にまとまります。

    補足:git fetchとgit switchとは

    • git fetchとは

      リモートリポジトリの最新履歴を取得し、ローカルの「リモート追跡ブランチ」に反映させるコマンドです。実際の作業ブランチには影響を与えません。以下の記事で詳しく解説しています。

      実は便利なGitコマンドgit fetchとは?git pullとの関係もあわせて解説!

      https://envader.plus/article/368

    • git switchとは

      ブランチを切り替える専用コマンドで、Git 2.23(2019年)から導入されました。初心者にも分かりやすく、安全に使える構文として注目されています。以下の記事もあわせてご覧ください。

      git switch完全ガイド初心者でも安全にブランチを切り替える使い方とハンズオン

      https://envader.plus/article/545

    git rebaseのオプションの紹介

    git rebase には、作業をより便利にするためのさまざまなオプションが用意されています。 特に使う機会の多い代表的なオプションを、以下にまとめました。

    オプション説明
    -i ,--interactiveインタラクティブモードで実行。コミットの並び替え、結合(squash)、メッセージの変更、削除などが可能
    --continueコンフリクトを解消したあと、リベース処理を続行する
    --abortリベースを中止し、リベース開始前の状態に戻す
    --skip問題のある現在のコミットをスキップして、リベースを続行する
    --onto指定したコミットの上に、任意の範囲の変更を適用する。高度な履歴操作に使用

    これらのオプションを知っておくことで、git rebase をより柔軟かつ効率的に使いこなすことができます。次のセクションでは、実際に rebase の操作を体験できるハンズオンを紹介します。

    git rebaseの使い方ハンズオン

    実際に git rebase を使って、コミット履歴を付け替える処理を体験しながら学んでいきましょう。今回は「直前のコミットを別のブランチの履歴の上に並び替える」という、シンプルでよく使われるケースを題材に進めます。

    1. テスト用のリポジトリを作成

    まずはテスト用のローカルリポジトリを作成します。

    # 新しいディレクトリを作成
    mkdir git-rebase-test
    cd git-rebase-test
    
    # Gitリポジトリを初期化
    git init

    2. コミットを2つ作成

    次に、main ブランチでファイルを作成してコミットを2つ準備しておきます。

    # コミット1:hello.txt を作成し、初期メッセージを追加してコミット
    echo "Hello World" > hello.txt
    git add hello.txt
    git commit -m "Hello World を追加"
    
    # コミット2:hello.txt に追記してコミット
    echo "Main branch update" >> hello.txt
    git add hello.txt
    git commit -m "mainブランチでの追加作業"

    3. feature/1ブランチを作成

    次に feature/1 ブランチを新しく作り、ファイルを作成してコミットします。

    # feature/1ブランチを作成して移動
    git switch -c feature/1
    
    # feature.txt を作成し、メッセージを追加してコミット
    echo "feature/1 work" >> feature.txt
    git add feature.txt
    git commit -m "feature/1の追加"

    4. git rebaseを実行

    main の履歴の上に feature/1 ブランチの変更を付け替えます。

    # mainの最新履歴の上に付け替える
    git rebase main

    コマンド実行後、以下のようなメッセージが表示されれば rebase が完了したことを確認できます。

    # rebaseの完了
    git rebase main
    Successfully rebased and updated refs/heads/feature/1.

    この操作によって、feature/1 ブランチのコミットは main の最新コミットの後ろに並び直されます。結果として、履歴が1本にまとまったスッキリした状態になります。


    このあとのセクションでは、より柔軟に履歴を編集できる git rebase -i(インタラクティブリベース) の使い方や、rebase 中にコンフリクトが起きた場合の対処法について詳しく解説していきます。

    git rebase -i:インタラクティブリベース

    git rebase -i(インタラクティブリベース)は、複数のコミットをまとめたり編集したりできる強力なオプションです。以下のような場面で特に役立ちます。

    • 細かく分かれてしまったコミットを整理したいとき
    • 曖昧なコミットメッセージを修正したいとき
    • 不要なコミットを履歴から削除したいとき

    ここでは、基本的な使い方と、よく使われるキーワード(picksquashreword)の意味と操作方法を紹介します。

    インタラクティブリベースの基本構文

    git rebase -i HEAD~3

    これは「直近3つのコミットを対象に編集する」という意味です。実行するとテキストエディタが開き、対象のコミット一覧が表示されます。

    # 表示例
    pick 9ac6db3 feature/1の追加
    pick d20c120 Good Morningを追加
    pick 8e2fb9e Good Nightを追加

    この一覧で使うキーワードが picksquashreword などです。

    pick:そのまま適用

    pick は、そのコミットを変更せずそのまま適用する指示です。特に編集しない場合は pick のまま、:wq でエディタを閉じて進行します。

    pick のまま進めると、以下のようなメッセージが表示され、rebase が正常に完了したことを確認できます。

    git rebase -i HEAD~3
    Successfully rebased and updated refs/heads/feature/1.

    実行後、git reflog で履歴を確認すると、以下のようなメッセージが表示されます。

    git reflog
    8e2fb9e (HEAD -> feature/1) HEAD@{0}: rebase (finish): returning to refs/heads/feature/1
    8e2fb9e (HEAD -> feature/1) HEAD@{1}: rebase (start): checkout HEAD~3

    reword:コミットメッセージを編集する

    reword は、コミットの中身はそのままにして、メッセージだけを変更したいときに使います。以下のようにメッセージを変更したいコミットの pickreword に変更し、:wq でエディタを閉じて進行します。

    # 変更例
    pick 0141820 feature/1の追加
    pick 4b65312 Good Morningを追加
    reword fcedc48 Good Nightを追加  ←pickをrewordに変更

    その後、reword に指定したコミットのメッセージ編集画面が開くので、変更する内容に書き換えます。今回はメッセージをより具体的にするために、Good Nightを追加-rebaseを実行 に変更します。

    テキストエディタを閉じた後、以下のようなメッセージが表示されます。

    git rebase -i HEAD~3
    [detached HEAD cbc2fb9] Good Nightを追加-rebaseを実行
     Date: Sun Jul 13 14:20:33 2025 +0900
     1 file changed, 1 insertion(+)
    Successfully rebased and updated refs/heads/feature/1.

    実行後、git reflog で履歴を確認すると、以下のようなメッセージが表示されます。

    git reflog
    cbc2fb9 (HEAD -> feature/1) HEAD@{0}: rebase (finish): returning to refs/heads/feature/1
    cbc2fb9 (HEAD -> feature/1) HEAD@{1}: rebase (reword): Good Nightを追加-rebaseを実行
    fcedc48 HEAD@{2}: rebase: fast-forward
    4b65312 HEAD@{3}: rebase (start): checkout HEAD~3

    このように、reword を実行したコミットには rebase (reword) と記録されており、直後に rebase (finish) のログが続いていれば、リベースは正常に完了したことがわかります。

    squash:前のコミットにまとめる

    squash は、そのコミットをひとつ前のコミットにまとめるときに使います。

    以下のようにまとめたいコミットの picksquash に変更し、:wq でエディタを閉じて進行します。

    pick 52a43fc feature/1の追加
    pick b76c2ae Good Morningを追加
    squash 8a170a4 Good Nightを追加  ←pickをsquashに変更

    その後、以下のようなコミットメッセージの編集画面が開きます。

    この画面では、両方のメッセージをそのまま残すか、まとめて書き直すかを自由に選ぶことができます。今回はメッセージの編集はせず、:wq で編集画面を閉じます。

    テキストエディタを閉じた後、以下のようなメッセージが表示されます。

    git rebase -i HEAD~3
    [detached HEAD edc1d48] Good Morningを追加
     Date: Sun Jul 13 14:24:24 2025 +0900
     1 file changed, 2 insertions(+)
    Successfully rebased and updated refs/heads/feature/1.

    実行後 git reflog で履歴を確認すると、以下のようなメッセージが表示されます。

    git reflog
    edc1d48 (HEAD -> feature/1) HEAD@{0}: rebase (finish): returning to refs/heads/feature/1
    edc1d48 (HEAD -> feature/1) HEAD@{1}: rebase (squash): Good Morningを追加
    b76c2ae HEAD@{2}: rebase (start): checkout HEAD~3

    特にチーム開発やオープンソースプロジェクトでは、こうした整理された履歴がコードレビューや保守性の向上にも大きく貢献します。


    squash は、複数のコミットを1つのコミットにまとめる操作です。以下の記事でさらに詳しく解説していますので、ぜひご覧ください。

    gitのコミット履歴を整理するためにsquashを使いこなそう

    https://envader.plus/article/268

    また、この手順で紹介した git reflog は、Gitで過去にどのような操作(チェックアウト・マージ・リセットなど)を行って、HEADがどのように移動したかを追跡できるコマンドです。詳しくは以下の記事を参照ください。

    Gitコマンド「git reflog」とは?「HEAD」も併せて解説!

    https://envader.plus/article/394

    コンフリクトが発生した場合

    git rebase を実行すると、まれに「コンフリクト(競合)」が発生することがあります。これは、同じファイルの同じ箇所に対して、異なるコミットで別々の変更が加えられている場合に起こります。

    インタラクティブリベースでは、過去のコミットを順番に適用し直すため、内容に矛盾があるとGitは自動で解決できず、ユーザーの手で修正する必要があります。

    コンフリクト発生時の対処手順

    1. 競合ファイルの確認

      rebase を実行しコンフリクトが発生すると、以下のようなメッセージが表示されます。競合しているファイルを確認します。(今回は、hello.txtでコンフリクトが発生しています)

      # 競合しているファイルを確認
      git rebase main
      Auto-merging hello.txt
      CONFLICT (content): Merge conflict in hello.txt
      error: could not apply f1885f5... feature/1の追加
      hint: Resolve all conflicts manually, mark them as resolved with
      hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
      hint: You can instead skip this commit: run "git rebase --skip".
      hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
      hint: Disable this message with "git config set advice.mergeConflict false"
      Could not apply f1885f5... feature/1の追加
    2. ファイルを開いて競合を解消

      コンフリクトが発生しているファイルを開き、「マージエディターで解決」を選択します。

      エディタ上でコンフリクトを解消し、マージを完了させます。

    3. 修正後にステージング

      修正したファイルをステージングします。

      # 修正したファイルをステージング
      git add ファイル名
    4. リベースを再開

      rebase 処理を続行します。

      # リベース処理を続行
      git rebase --continue

      テキストエディタ(VimやVSCodeなど)が開くので、そのまま :wq(保存して終了)すればOKです。

      以下のメッセージが表示され、rebase でのコンフリクトが解消されました。

      git rebase --continue
      [detached HEAD 95f3a26] feature/1の追加
       1 file changed, 1 insertion(+)
      Successfully rebased and updated refs/heads/feature/1.

    リベースを中止したい場合

    途中で処理を中止して元に戻したい場合は、以下のコマンドを使います。

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

    これにより、rebase 開始前の状態にロールバックされます。

    rebase は「一つひとつのコミットを順番に適用し直す」動きのため、マージよりもコンフリクトが発生しやすい傾向があります。

    ですが、履歴をきれいに整えることで、後からの見直しやレビューがしやすくなるという大きなメリットがあります。


    さまざまなGitコマンドを活用できるようになると、Git操作に自信がつきます。もし、Git操作が不慣れと感じている方には、次に紹介する学習方法がおすすめです。

    Gitの使い方を学ぶ:おすすめの学習方法

    「Gitの操作、まだちょっと不安かも…」そんな方におすすめなのが、「エンベーダー」です。 Gitの基本コマンドをはじめ、エンジニアに欠かせないLinuxの知識や操作をブラウザ上で気軽に学べる学習サービスです。

    環境構築は不要。わずか5秒で学習環境が起動し、実際にコマンドを入力しながら学べるので、ゲーム感覚で楽しくスキルを習得できます

    エンベーダー公式サイト - Gitの使い方コース

    https://envader.plus/course/5/scenario/1055

    ポイント1:コマンド入力はすべてブラウザ上で完結。実際に手を動かして学べます。

    ポイント2:入力したコマンドの正誤や解説を、すぐに確認できます。

    ポイント3:Gitだけでなく、Linuxやデータベース操作など、今後のキャリアに活かせる学習コースも豊富に用意されています。

    エンベーダーの学習コース一覧

    https://envader.plus/course

    いくつかのコースは無料で体験できるため、「コマンドに慣れたい」「楽しくGitを身につけたい」という方は、ぜひ一度エンベーダーを試してみてください。

    この記事で学んだこと

    git rebase を使いこなすことで、コミット履歴をスッキリと整理し、より見やすく保つことができるようになります。

    この記事では、git rebase の基本的な仕組みや使い方、インタラクティブリベース(rebase -i)の活用法、コンフリクトが起きたときの対処法まで、段階を追って解説してきました。

    実際に手を動かしながら学ぶことで、rebase の動きをより具体的にイメージできたのではないでしょうか。

    今回学んだ内容をベースに、今後は git merge との使い分けや、複雑な履歴の整理、チームでの rebase 運用といったステップにも挑戦していくと、Gitの理解がさらに深まります。

    履歴の「きれいさ」は、プロジェクトの「見通しのよさ」につながります。次の開発をもっと快適に進められるよう、ぜひ実際の作業でも rebase を活用してみてください。

    参考資料

    以下のリンクは、この記事で解説した手順や概念に関連する参考資料です。より詳しく学びたい方は、ぜひご覧ください。

    【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

    IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

    プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

    「フリーランスエンジニア」

    近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

    「成功する人とそうでない人の違いは何か?」

    私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

    比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

    多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

    note記事3000いいね超えの殿堂記事 LINE登録で記事を見る

    エンベーダー編集部

    エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

    RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

    関連記事