デジタルトレンドナビ
システム開発

2023.12.04

git rebaseとは?mergeとの違いや使い方・取り消し方法

git rebaseとは?mergeとの違いや使い方・取り消し方法

システム開発においてコンフリクトはつきものです。修正が必要になって履歴を確認しようとしても、見づらいと感じることもあるのではないでしょうか?ほかのプロジェクトメンバーの作業も進行しているため、どれが最新かわかりづらく、作業が進まないと悩んでいるエンジニアの方も多いはずです。

コミットの履歴が見やすく最新の状態を保て、作業の効率化を計りたいならgit rebaseを使いこなしましょう。


そこで今回は、git rebaseとmergeの違いや使い方を紹介します。2つの取り消し方法についても解説していますので、あわせてご覧ください。git rebaseには一つの注意点があります。git rebaseを利用する前には、紹介している注意点を抑えるのがおすすめです。

この記事でわかること

  • git rebaseとはどんな機能か
  • git rebaseのメリットと注意点
  • git rebaseの使用方法・取り消し方法

git rebaseとは

git rebaseとは

git rebaseとは、コミットをブランチに変えて作り直したりまとめたりして、ログをきれいにするコマンドです。つなげた順番にコミットが記録されるため、あとでコミットを確認する場合も見やすくなります。これまでのコミット履歴を整理できることから、merge前に行うのが一般的です。ただ、処理自体はmergeと似ています。

git rebaseとmergeの違い

git rebaseとmergeの違い

git rebaseとmergeは、どちらもブランチの統合方法です。しかし、コミットの記録部分で違いがあります。mergeは分岐元と分岐したブランチを統合した新しいコミットを作成します。git rebaseと異なり、分岐したブランチのコミットはとってきません。よって、git merge後のコミットは一つのみとなります。

git rebaseは分岐以降のコミットをとってくる、git mergeは新しいコミット一つのみになる、これが主な違いになります。

git rebaseのメリット

git git rebaseのメリット

作業に関わるメンバーがGitに慣れており、記録を正確に残したいならgit rebaseがおすすめです。git rebaseには履歴が見やすい、最新の状態を保ちやすいなどのメリットがあります。

履歴が見やすくなる

基本的にmergeの場合、変更内容の確認は中身を見に行く手間が必要です。メッセージを変更すれば確認しやすくなりますが、少し複雑な作業で時間がかかります。複数回mergeによってブランチの変更を取り込む場合、取り込むごとに新しいコミットが作成されるため、いくつもブランチの線が重なり、非常に見にくくなるところが難点です。

しかし、git rebaseであれば、履歴が一直線に並び一目で確認できます。ブランチの変更を繰り返しても重ならないため、変更履歴が見やすくなります。プロジェクトの内容が複雑であればあるほど、git rebaseを利用する方が作業がスムーズに進み、共有もしやすいところもメリットです。

最新の状態を保ちやすくなる

git rebeseはコミットの履歴をGitログ上に残さないため、変更内容をこまめに取り込んでもデメリットがありません。そのため、いつでも最新の状態を容易に保てます。また、最終的にmergeする場合も、事前にgit rebaseしておいた方が最新の状態をmergeできるため、ログイン周りのテストも安心です。

また、複数人で同じ箇所の変更をした場合、mergeであればすべて新しいコミットとして残ってしまい、どれが最新のものか分かりにくくなります。しかし、git rebaseであれば追加コミットがブランチからなくなり、最新の状態になるのでとてもシンプルです。

コンフリクトをコミットごとに直せる

ブランチの変更を取り込む際に、コンフリクトが起こることも珍しくありません。コンフリクトをmergeを使用して修正する場合、ブランチすべての変更に対して行うため、修正が大掛かりになりがちです。

しかし、git rebaseの場合は一つずつのコミットに対して修正できます。コンフリクト箇所のコミットだけ手を加えられると狭い範囲の修正で済むため、最低限の作業工程で済むところがメリットです。

また、git rebaseにはコミットをまとめる機能があります。それぞれの修正が済めば、まとめる機能を利用して履歴を整理し、見やすくすることも可能です。

git rebaseの注意点

git rebaseの注意点

GitHubにプッシュしたコミットをrebaseしてはいけません。
GitHubの情報とローカルの情報に矛盾が出て、どちらを優先するべきかわからなくなります。結果、Git Hubにアップされている情報を優先するように動いてしまい、ローカルからの新しくプッシュされた情報を受け取りません。ローカルにmainブランチがある場合を例として説明します。

ローカルにコミット1があるとして、その状態からfeatureブランチを作成してコミット2を作成しました。そしてこれをGitHubにプッシュします。

ここから再度ローカルに戻ってコミット3を作成してから、このコミット3の変更内容をコミット2に取り込みます。このとき、履歴をきれいにまとめたいという理由から、git rebaseすると、親コミットはコミット3と認識されます。この変更はGitHubにも反映させる必要があるため、GitHubにプッシュしようとしますが、もうこの状態ではプッシュできません。

ローカルの情報はコミット1→コミット3→コミット2’(変更後のもの)になっています。一方、GitHubはコミット1→コミット2となっているため、情報の矛盾が発生し、はじかれてしまうためです。

もし、今回のようにGitHubにプッシュしたコミットの内容を修正する場合は、git rebaseするのではなく、再度新しいコミットを作って対応します。

git rebaseの使い方

git rebaseの使い方

git rebaseには開発コミットをつなげ直す方法と、複数のコミットを一つにまとめる方法の2つの使い方があります。それぞれの方法を解説します。

開発コミットをつなげ直す

それぞれを別ブランチで作成していた開発コミットをつなげ直す場合、git rebaseなら指定したブランチの先に新たに作成でき、一直線につなげられます。コマンドの詳細は以下のとおりです。

git rebase+[つなぐ元にするブランチ名]

このように、rebaseコマンドの後ろにつなぎ元のブランチ名をつけるだけになります。

複数のコミットを1つにまとめる

もう一つの使い方、複数のコミットを一つにまとめる場合は、rebaseコマンドの「-i」オプションを利用します。新たなコマンドに複数のコマンドをまとめた内容での作成が可能です。コマンドは以下のとおりです。

git rebase -i HEAD~[直近からコミットをまとめる件数]

たとえば、5つのコマンドをひとまとめにしたいとします。次のコマンドを実行すると、テキストエディタが開き、コミットの古い順に履歴が出力されます。

git rebase -i HEAD~5

表示されている「pick」を「s」または「squash」へ変更します。変更後、統合のためにエディタが2回開き、それぞれ修正すればコミットのまとめる作業が完了です。

作業が完了したらgit logで確認します。ハッシュ値は新たな値が割り振られていますが、変更日時は「squash」前のコミットと同じになります。

git rebaseの取り消し方法

git rebaseの取り消し方法

git rebaseで取り消す必要が出てきた場合でも、コマンド一つで簡単に取り消せます。履歴をたどって取り消す方法と、直前実施したgit rebaseを取り消す方法を紹介します。

git resetを使う

誤ってgit rebaseしてしまった場合でも、履歴をたどって指定位置から取り消すことが可能です。

まずは、以下のコマンドで履歴を確認します。

git reflog

上記のコマンド以降に直近の変更が表示されるため、戻したい位置を確認します。確認できれば、取り消したい直前のコミットを指定するために以下のコマンドを入力します。

git reset –hard HEAD@{n}

(nは取り消したい直前のコミットです)

さらに、『hard reset』したときも『git reflog』で再度履歴を確認し戻すことも可能です。

削除方法に『git gc』もありますが、この方法では『git reflog』でログが見れなくなるため、戻せなくなります。

ORIG_HEADを使う

履歴をたどって取り消す場合はgit resetが適切ですが、直前に実施したrebaseを取り消す場合は、「ORIG_HEAD」を使って取り消せます。入力するコマンドは以下のとおりです。

git reset –hard ORIG_HEAD

git rebaseを使用してコミットに修正を加えていると、コンフリクトが発生する場合もあります。指定箇所から取り消すgit resetや、直前のgit rebaseを取り消すORIG_HEADではなく、abortを使用することで、git rebaseを完全に取り消すことも可能です。コマンドは以下のとおりです。

git rebase –abort

コマンドを実行することで、git rebaseが行われる前の状態に戻せます。

rebaseとmargeを上手く使い分けよう

rebaseとmargeを上手く使い分けよう

git rebaseとは、コミットをブランチに変えて作り直したりまとめたりして、ログをきれいにするコマンドです。つなげた順番にコミットが記録されるため、あとでコミットを確認する場合も見やすくなります。

同じくつなげる方法としてmergeがありますが、mergeは分岐元と分岐したブランチを統合して新しいコミットを作成するため、履歴が確認しにくくなります。しかし、Gitに慣れていない場合は、mergeの方が使いやすいなどメリットもあります。

作業の効率化を求める場合や記録を正確に残したい場合はgit rebase、プロジェクトメンバーでメールやチャットなどコミュニケーション部分を補えるならmergeなど、状況によって上手く使い分けましょう。

株式会社テクノデジタルでは、WEBサイトやアプリ開発などを行っています。経験豊富で高度な技術を持ったエンジニアがシステム開発のお手伝いをいたしますので、お困りの際は、ぜひお気軽にお問い合わせください。

投稿者

  • デジタルトレンドナビ編集部

    システム開発、Webサイト制作、ECサイトの構築・運用、デジタルトランスフォーメーション(DX)など、デジタルビジネスに関わる多岐の領域において、最新のトレンド情報や実践的なノウハウを発信してまいります。