git rebaseとは?
git rebaseとは、特定のブランチのベース(起点)を他のブランチの最新コミットに移動させ、コミット履歴を整理するためのコマンドです。
主な用途としては以下があります。
- 他ブランチの最新変更を取り込みたいとき
- コミット履歴をシンプルに整理したいとき
- プルリクエストを提出前にコミットを整理したいとき
git rebaseの基本構文
git rebaseの基本構文は以下のとおりです。
git rebase [ベースブランチ名]
具体例:
git checkout feature
git rebase main
上記により、featureブランチをmainブランチの最新コミット上へ移動させます。
git mergeとの違い
git rebaseとgit mergeは、どちらも他ブランチの変更を取り込む際に利用しますが、以下のように違いがあります。
- git merge
履歴が並列になり、マージコミットが生成されます。履歴の流れを残したいときに便利です。 - git rebase
履歴が直線的になり、コミットが書き換えられます。履歴をシンプルに保ちたいときに便利です。
状況に合わせて、上手に使い分けましょう。
rebaseの基本的な流れ
git rebaseを使用する基本的な流れは以下の通りです。
- 最新の状態を取得する
git checkout main
git pull
- 作業ブランチに移動する
git checkout feature
- rebaseを実行する
git rebase main
- 競合が発生した場合は競合を解決する(後述)
- rebase完了後、変更をpushする場合は強制pushが必要
git push -f origin feature
競合が起きた時の対処法
git rebaseをすると競合(コンフリクト)が発生することがあります。
競合が発生した場合の対処法は以下の通りです。
- 競合したファイルを手動で修正する
- 修正後、ステージングエリアへ追加する
git add [ファイル名]
- rebaseを継続する
git rebase --continue
競合解決をやめて中断する場合は次の見出しの方法を使います。
rebaseを中断する方法
git rebaseを途中でやめて元の状態に戻したいときは、以下のコマンドを実行します。
git rebase --abort
これにより、rebase開始前の状態に安全に戻ることができます。
インタラクティブrebase入門
インタラクティブrebase(interactive rebase)とは、コミットの編集・削除・並び替えなどを対話形式で行える便利な機能です。
基本構文:
git rebase -i [開始コミットハッシュ]
具体例(直近3つのコミットを操作する場合):
git rebase -i HEAD~3
実行するとエディタが開き、以下のような操作が可能です。
- pick:コミットを残す
- squash:コミットを前のコミットに統合する
- edit:コミットを編集する
- drop:コミットを削除する
コミット履歴を整理する方法
コミット履歴をきれいに整理する場合、主に以下の方法があります。
- コミットを1つにまとめる(squash)
コミットをまとめるにはinteractive rebase時に”squash”を指定します。
git rebase -i HEAD~3
エディタ内でコミットを以下のように指定します。
pick abc1234 機能A追加
squash def5678 機能A修正
- コミット順序を変更する
エディタ内でコミットの順序を変更して保存して閉じるだけで、コミット順序が入れ替わります。
rebase使用時の注意点
git rebaseを使う際には以下の注意点があります。
- rebaseはコミット履歴を書き換える操作のため、すでに他の開発者と共有されているブランチでは使わないよう注意しましょう。
- rebase後のブランチをリモートにpushする場合は、強制push(
git push -f
)が必要です。 - 万が一のため、rebase前にバックアップブランチを作成することをおすすめします。
git rebaseコマンド早見表
最後に、よく使うgit rebaseコマンドを早見表にまとめました。
操作内容 | コマンド |
---|---|
基本rebase | git rebase [ベースブランチ] |
インタラクティブrebase | git rebase -i HEAD~n |
rebaseの継続 | git rebase --continue |
rebaseの中断(元に戻す) | git rebase --abort |
コミットを統合する | git rebase -i 後にsquash |
強制push(rebase後) | git push -f origin [ブランチ名] |
git rebaseを活用し、コミット履歴をきれいに保ちつつ、開発を効率化しましょう。