🎢

git rebaseとは

2023/12/06に公開

1. rebaseとは

rebaseは、作業が完了したブランチを分岐元のブランチにくっつける時に使う機能です。
Gitには、このコマンドの他にmergeも同じような機能を持っています。

2. git rebasegit mergeの違い

では、この2つのコマンドの違いはなんだろうか?

2-1. リベースの利点

リベースには下記の利点があります。

  • コミット履歴が一直線になってわかりやすくなる
  • 複数のコミットを1つに統合できる

では、1つ1つ見ていきましょう。

コミット履歴が一直線になってわかりやすくなる
  • マージの場合
    • マージだとコミット履歴が枝分かれした後、合流するといった形になり一直線にはなりません・・・

  • リベースの場合
    • 同じ内容の別コミットC'、D'が指定したブランチの先から作られることで、一直線になります

複数のコミットを1つに統合できる

4つのコミットABCDを持つbranchがあるとします。
これら4つのコミットはそれぞれが微修正であるため、ひとまとめにしたいです。
そんなときは、rebaseの「-i」オプションを利用するといいです。

git
git rebase -i 開始のcommitID

実行すると、「新規コミットE」として、指定した複数のコミットをまとめられました。

3. リベースコマンド

リベースをしてコミット履歴を綺麗にする場合は下記のコマンドを実行する必要があります。

git
git rebase <upstream> <branch>
  • <upstream>は、比較するアップストリームブランチです。既存のブランチ名だけでなく、任意のコミットである可能性があります。デフォルトは現在のブランチです。
  • <branch>は、ワーキングブランチです。デフォルトはヘッドです

4. リベースの注意点

綺麗で見やすいコミット履歴を作成するのに、とても役立つリベースですが注意点もあります。
それは、rebaseコマンドは処理を作り直してしまうため、既存のコミットへ影響を与えてしまうことです。
安易に使用すると、誰かのコミットを勝手に作りなおすことになり、チームに混乱を招くことに繋がります。
pushして誰かの目に触れた処理や、他の人の手の入っている箇所では、rebaseでなくmergeを使用するようにしましょう。

5. オプション一覧

  • git rebase --continue
    • リベース中のコンフリクトを解決した後、リベースプロセスを再開します。
  • git rebase --abort
    • リベース操作を中止し、ヘッドを<branch>にセットしリベース開始時に戻します。リベース操作の開始時に<branch>が指定されていた場合、ヘッドは<branch>にリセットされます。それ以外の場合、ヘッドはリベース操作が開始されたときの位置にリセットされます。
  • git rebase --quit
    • リベース操作を中止しますが、ヘッドはオリジナルブランチにリセットしません。その結果、インデックスとワークツリーも変更されません。「–autostash」を使用して一時的なスタッシュエントリが作成された場合、それはスタッシュリストに保存されます。

参考サイト

git rebaseの使い方

Discussion