更新日:2026年5月25日

6分で読めます

Git rebaseを活用してワークフローを改善する

Gitリベースの機能を活用して、ワークフローを改善する方法をご紹介します。

近年、開発者はマージリクエストのレビューに多くの時間を費やしており、レビュー内容をもとにコードを改善する作業も欠かせません。この記事では、Git rebaseを使ってレビューサイクルを短縮する方法を解説します。まずはワークフローの観点から整理してみましょう。

マージリクエストの修正方法

コードの変更を加えてマージリクエストを作成した後、修正が必要になるケースはよくあります。テストの失敗、バグの発見、レビュアーからの改善提案など、理由はさまざまです。

シンプルだが煩雑な方法:コミットを積み重ねる

一つ目の方法は、マージリクエストの元となるブランチの上に新しいコミットをどんどん追加し、ブランチをプッシュしてマージリクエストを更新する方法です。

しかし、この方法で多くのコミットが積み重なると、マージリクエストが扱いにくくなります。

  • 全体の変更をまとめてレビューするのが難しくなる
  • コミットごとにレビューしようとしても、無関係な変更や同じコードの複数回の修正が混在している場合があり、レビューしにくい

レビュアーにとって理想的なのは、独立した小さなコミットに分割されていて、個別にレビューできる形式です。

プロの方法:リベースを使う

マージリクエストの準備や修正をより効果的に行う方法は、各コミットを常に小さく、自己完結した、レビューしやすい単位に保つことです。

つまり、新しいコミットを積み重ねるのではなく、ブランチ内の既存のコミットをすべて整理し直す必要があります。これは複雑で手間がかかるように思えるかもしれませんが、git rebaseがその助けになります。

git rebaseでコミットを整理する

小さく自己完結したコミットの積み重ねでマージリクエストを構成するには、ブランチのコミットを大幅に整理する必要があることがあります。コミットの準備が整ったら、ブランチをプッシュしてマージリクエストを作成または更新できます。

インタラクティブリベースを開始する

ブランチがmainブランチをベースにしている場合、ブランチを整理するコマンドは次のとおりです。

      git rebase -i main

    

このコマンドはとても頻繁に使うことになるので、今すぐGitエイリアスやシェルエイリアス・関数として登録しておくことをお勧めします。

git rebaseに渡す-iオプションは--interactiveの短縮形です。これによりインタラクティブリベースが起動し、エディターが開きます。エディターには、ブランチ内のコミット一覧と、#で始まるコメント行が表示されます。コミット一覧は次のような形式です。

      pick 1aac632db2 first commit subject
pick a385014ad4 second commit subject
pick 6af12a88cf other commit subject
pick 5cd121e2a1 last commit subject

    

各行は、git rebaseがそのコミットをどう処理するかを示す命令です。コミットは古い順に並んでおり、最も古いコミットが先頭に来ます(デフォルトのgit logの表示順とは逆です)。各行の構成要素は次のとおりです。

  • コミットに対する操作(ここではpick
  • 短縮されたコミットID
  • コミットの内容を識別するためのサブジェクト

命令リストを編集する

この命令リストは編集できます。テキストエディターを閉じると、git rebaseが編集された命令を読み込み、順番に実行してブランチを希望どおりに再構成します。

全コミットの命令の後には、コメント行として編集方法と各命令の説明が表示されます。

  • コミットの命令行全体を削除すると、そのコミットは再作成されません
  • 命令行の順序を入れ替えると、コミットが指定した順序で再作成されます
  • 操作をpickから別のものsquashrewordなど)に変更すると、指定した操作がそのコミットに適用されます
  • 既存の行の前後や間に新しい命令行を追加することもできます

コメント行の説明だけでは不十分な場合は、以下の資料も参考にしてください。

リベースの続行または中断

インタラクティブリベースは、コンフリクトが発生した場合(通常のリベースと同様)や、命令にeditを使用した場合に一時停止します。一時停止中は、現在のコミットを二つに分割したり、コンフリクトを解消したりといった作業が可能です。その後は次のいずれかを選べます。

  • git rebase --continueでインタラクティブリベースを続行する
  • git rebase --abortでリベース全体を中断する

(これらのgit rebaseオプションは、通常の非インタラクティブなリベースが一時停止した場合にも使えます。)

さらに役立つヒント

さまざまな命令を試す

各命令行で使える操作を実際に試してみることをお勧めします。特にrewordeditsquashfixupは便利です。すぐに略語版のresfも使いたくなるはずです。

リベース中にシェルコマンドを実行する

exec <command>という命令を使うと、インタラクティブリベースの任意の時点でシェルコマンドを実行できます。非インタラクティブリベースでの活用が特に便利で、例えば次のように使います。

      git rebase --exec 'make test' main

    

-iフラグがないので、これはインタラクティブリベースではありません。)

--exec <command>フラグを使うと、リベース済みの各コミットの後にシェルコマンドが実行されます。シェルコマンドが失敗した場合(ゼロ以外の終了コードが返された場合)、リベースはそこで停止します。

すべてのコミットをテストする

make testのようにソフトウェアのビルドとテスト実行を行うコマンドを--execに渡すと、ブランチ内の各コミットが正しくビルドされ、テストをパスするかどうかを確認できます。

make testが失敗するとリベースが停止します。その場で現在のコミットを修正し、リベースを続行して次のコミットのテストに進めます。

各コミットがきれいにビルドされ、すべてのテストをパスすることを確認しておくと、コードベースを常に健全な状態に保てます。リグレッションが発生したときにGit bisectを活用したい場合にも特に有効です。

まとめ

Gitにおけるリベースは、コミットを整理するための非常に柔軟で強力なツールです。高品質な変更を高品質なコミットとマージリクエストとして提案するワークフローの実現に、ぜひ活用してください。開発者とレビュアーの効率が向上し、コードレビューやデバッグもより容易かつ効果的になります。

追記: このブログの続編として、実際のプロジェクトでリベースを適用する方法も公開しています。ぜひあわせてご覧ください。

ご意見をお寄せください

このブログ記事を楽しんでいただけましたか?ご質問やフィードバックがあればお知らせください。GitLabコミュニティフォーラムで新しいトピックを作成してあなたの声を届けましょう。

フィードバックを共有する

今すぐ開発をスピードアップ

DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。