git rebaseしてはいけない状況(mergeとの違い)

git rebaseのイメージ画像 用語

git rebaseとgit mergeは
両方とも「ブランチAの変更差分を、ブランチBに取り込む」コマンドである。

前提として、違いが良く分かっていなければ、基本的にmergeだけ使えば十分である。

そのうえで、コミットログを整理したいという欲が出てきたらrebaseを覚えると良い。

この記事の注意点

この記事では、筆者が業務で感じた主観が多く入っているため
rebaseを運用する場合の一例として見ていただきたい。

結論:rebaseしてはいけない状況

■rebaseしてはいけない状況

  1. プルリクエストのレビュー中
  2. mainブランチに変更を反映する時

■rebaseしてもよい状況

  1. まだ誰にもレビューされていない状態で、mainブランチの変更差分を取り込む

これらを詳しく説明するために、mergeとrebaseについての違いを説明していく。

mergeとrebaseの違い

mergeとrebaseの違いは簡単に言うと、過去のコミットIDが変わってしまうかどうかである。

  • merge:今まで修正を加えたコミットIDは変わらない
  • rebase:今まで修正を加えたコミットIDが変わる

開発中ブランチ「feature」に、mainブランチで発生した変更を取り込みたい
というケースを考えると、
mergeとrebaseの違いは以下のようになる。

見て分かる通りrebaseは、履歴を整理したいモチベーションで使うコマンドなので
その副作用としてコミットIDが変わってしまう、という点が最大の注意点である。

プルリクエストレビュー中にrebaseしてはいけない理由

GitHubには「以前途中までレビューしたところからの差分を確認する」という機能がある。

rebaseを利用してコミットIDが変わってしまうと、
以前ここまで見た、というコミットIDが消滅してしまうので
「前見たところからの差分が見たい」というレビューができなくなってしまう。

mainブランチに変更を反映する時

rebaseはコミットIDを書き換えることができるコマンドであるため
大切なmainブランチに対してはやらないほうが良い。

基本的にはmainブランチにはありのままの履歴を残しておくべきだからだ。

細かいことを言うと、ローカルでrebaseしたあとはforce pushが必要になる。
mainブランチに対してforce pushは危険なためやらない方が良い。

まとめ

  • コミットログをきれいにしたいときにrebaseを使う
  • レビュー中やmainブランチに対してはrebaseは使わない方が良い
タイトルとURLをコピーしました