サイトアイコン ITC Media

【覚えよう】git rebaseとは?使うべき場面など丁寧に解説

(最終更新日:2023年8月)

✔当記事は以下の疑問を持つ方に向けて書かれています

「”git rebase”とは具体的に何をするコマンドなのか?」
「”git rebase”の使用方法を学びたい」
「”git rebase”の実践的な使用例を見て理解したい」

✔当記事で解説すること

当記事では、git rebaseの基本理解から始め、その使い方やオプションを活用した応用例まで、事例を用いながら深く解説していきます。

ぜひ最後までご覧ください。

筆者プロフィール

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

gitとgit rebaseの基本

Gitとその基本的な機能、特にブランチ機能と分散作業について理解します。

gitとは

Gitは、分散型バージョン管理システムのひとつで、複数人の開発者が共同で作業するプロジェクトを効率的に管理するもの。

コードの変更履歴を追跡し、必要に応じて過去の状態に戻せる機能を持ちます。

さらにブランチ機能を用いて、複数の機能開発やバグ修正を同時に進行させることが可能です。

gitのブランチ機能

Gitのブランチ機能は、一連のコミットの流れを分岐させるためのもので、独立した作業スペースを提供するもの。

これにより、同じリポジトリ内で複数の作業を並行して進められます。

新しい機能を開発するためのブランチを作成し、作業が完了したらそのブランチをメインブランチ(通常はmasterブランチ)にマージするという流れが一般的です。

gitの分散作業

分散型バージョン管理システムであるGitでは、各開発者がローカル環境で完全なリポジトリのコピーを持てます。

ネットワーク接続がない場所でも作業を進行させることが可能で、変更履歴をローカルに保存するための安全性も提供。

作業結果は、リモートリポジトリにプッシュすることで共有することが可能です。

git rebaseとは

git rebaseとは、ブランチ間での作業を整理し、コミット履歴をきれいにするための機能です。

具体的に表すと、ブランチの生えている根っこ(ベース)を、指定した先に変更すること、といえます。

その結果、分岐した開発線を直線的にし、コミット履歴を読みやすく整理できます。

git rebaseの使用法

ここではgit rebaseの具体的な使用方法と、それによる作業の効率化について詳しく見ていきます。

開発コミットを連携させる方法

git rebaseの主な機能のひとつに、開発コミットを連携させるというものがあります。

これは、特定のブランチから別のブランチに移動した際に、元のブランチで行われたコミットを新しいブランチに反映させるための方法です。

図解:コミットの連携方法

コミットの連携を図で表してみました。

初期状態からgit rebase後までを順にご覧ください。

初期のコミット状態

“feature”ブランチでコミット “X” と “Y”は、”master” ブランチでは反映されていません。

                       feature
                          ↓
A -- B -- C -- D        X -- Y
(master branch)       (feature branch)

ブランチのイメージ図(git gui)

git rebaseの使用

git rebaseを実行します。

$ git checkout feature
$ git rebase master

git rebaseを使用すると、”feature”ブランチのコミットが “master” ブランチの最新コミット(この場合 “D”)の後に再配置されます。

git rebase後のコミット状態
A -- B -- C -- D -- X' -- Y'
(master & feature branch)

これで “feature” ブランチの変更が “master” ブランチに反映されました。

具体的なコマンドの解説

上記の操作は次のコマンドで実現できます。

git checkout feature
git rebase master

featureブランチに移動したうえで、git rebaseをおこないます。

どのように複数コミットをひとつにまとめるか

git rebaseは、複数のコミットをひとつにまとめる機能も提供しています。

これにより、一連の変更履歴を整理できるのです。

図解:複数コミットのマージ方法

例えば、以下のようなコミット履歴があったとします。

A---B---C---D topic
     /
E---F---G master

ここで、”B” “C” “D”の三つのコミットをひとつにまとめます。

A---BCD topic
     /
E---F---G master

この結果はgit rebaseを用いて、具体的にはgit rebase -i(対話的rebase)を使って実現できます。

具体的なコマンドの解説

上記の操作は次のコマンドで実現できます。

git checkout topic
git rebase -i HEAD~3

ここで、HEAD~3は最新のコミットから3つ前のコミットまでを指します。

このコマンドを実行すると、エディタが開き、各コミットの前にpickと書かれているはずです。

最初のコミットの前のpickをそのままにし、次のコミットの前のpicksquashまたはsに変更すると、そのコミットを前のコミットに統合できます。

git rebaseとgit merge:どちらを使用するべきか

開発フローには通常、git rebasegit mergeのどちらか、または両方が含まれます。

しかし、これらが何であるか、どのような状況でどちらを使用すべきかを正しく理解することが重要です。

git mergeとgit rebaseの違い

Gitにおけるmergerebaseは共にブランチを統合するためのコマンドですが、それらの動作は大きく異なります。

git mergeは、2つのブランチ間の差分を新たな”マージコミット”としてコミット履歴に加えます。

この方法は、ブランチ間の並行した作業を明確に表示するため、プロジェクトの歴史を追跡しやすくします。

しかしこれはコミット履歴を複雑にする可能性もあります。

# Merge feature into master
git checkout master
git merge feature

マージをおこなった証跡がコミット履歴として残ります。

わかりやすい反面、コミット履歴自体は多くなることを覚えておきましょう。

一方git rebaseは、あるブランチのコミットを別のブランチに”再適用”します。

一直線のプロジェクト履歴が作成されるイメージです。

不必要なマージコミットを防ぎ、より読みやすい履歴を提供します。

ただしこのプロセスは既存のコミット履歴を改変するため、注意が必要です。

# Rebase feature onto master
git checkout feature
git rebase master

正しく証跡として残すのか、見やすさを重視するのか、コミットの内容などで決定するのが良いでしょう。

共同開発の視点からみた比較

git mergegit rebaseのどちらを使用するべきかは、共同開発の視点から考えることが重要です。

git mergeは歴史の全ての詳細を保存し、何がいつどのようにおこなわれたかを追跡しやすくします。

これは、大規模なプロジェクトや多数の開発者が関与する環境では特に有益です。

一方git rebaseは歴史をきれいに保つために使用されます。

開発者が各々の変更を明確に分離したい場合や、個々の変更を見つけやすくするために、歴史を一直線に保つことが重要な小規模プロジェクトに適しています。

結論:どちらを使用すべきか

結論として、git mergegit rebaseはそれぞれ異なるシナリオで役立ちます。

どちらを使用するべきかはプロジェクトのニーズと開発環境によります。

git rebaseをさらに深掘り

それでは、git rebaseの基本的な使用法を理解した上で、より深いレベルでのgit rebaseの利用方法について探っていきましょう。

リベースの進行中の挑戦

git rebaseを使用する際には、いくつかの困難に直面する可能性があります。

コンフリクトの解決など、よく起こる挑戦的な部分です。

コンフリクトとは、同じ行に対して異なる変更がおこなわれた場合に発生するもの。

Gitはどの変更が優先されるべきかを自動的に決定できないため、手動で修正する必要があります。

例えば、次のコマンドを使用してリベースを開始し、コンフリクトが発生した場合の例です。

git checkout feature
git rebase master

コンフリクトを解消した後に、git rebase --continueを使用してリベースを続行します。

# Edit files to resolve conflicts
git add <resolved-file>
git rebase --continue

リベースした状況でのリベース

リベースを行った後でも、さらなるリベースが可能です。

これはとくに、変更がまだメインラインにマージされていないフィーチャーブランチの場合に有用です。

既にリベースされたブランチに対して新たなリベースをおこなう場合、まずブランチをチェックアウトし、次にリベースコマンドを実行します。

たとえば、featureブランチが既にmasterにリベースされており、それ以降にmasterブランチに新たなコミットが追加された場合、次のようにfeatureブランチを再度masterにリベースできます。

git checkout feature
git rebase master

フィーチャーブランチは常に最新のmasterブランチの状態に保たれます。

まとめ:初心者のためのgit rebaseガイド

ここまで、git rebaseの基本的な理解と使用方法を解説しました。

git rebaseは強力なツールであり、ブランチのコミット履歴を効果的に管理できます。

しかし、その力を適切に使うには理解と慎重さが必要です。

このガイドがあなたのGitの旅に役立つことを願っています。

モバイルバージョンを終了