Blog

git rebase -i で複数コミットをまとめてコミットログを綺麗にするハンズオン

はじめに

こんにちわ!
マイ ニフティチームの寺島です。
普段はスマートフォン向けのアプリケーション開発に携わっています。
ブログ運営チームのメンバーでもあります!

機能開発やバグ修正を進めていると、途中で「typo修正」「ログ出力追加」「ちょっとリファクタ」など、小さなコミットが積み重なることがありますよね。そのままプルリクエストを出すと、コミット履歴が細かすぎてレビューしづらくなったり、プロジェクト全体の履歴がノイズが多くなってしまったりします。

そんなときに役立つのが、Gitのrebase -iコマンドを使った「コミットの整理」です。
特に複数のコミットを一つにまとめる(squashする)方法は、プルリクエストを出す前の準備として非常に有効です。

今回、実際に手を動かしながら、git rebase -iを使って複数コミットを一つにまとめる手順を解説します。

ハンズオン用のリポジトリを作成する

今回のハンズオンで使用するダミーのリポジトリを作成します。
適当なディレクトリで以下のコマンドを順に実行してください。

git log --onelineを実行すると、最初のコミットが表示されるはずです。

次に、まとめる対象となる複数のコミットを作成していきます。
いくつかの変更を加え、それぞれ順にコミットしてください。

git log --onelineを実行すると、以下のように4つのコミットが積み重なっていることが確認できるはずです。(ハッシュ値は環境によって異なります)

これで準備は完了です!
最新の3つのコミット(”chore: add second line”、”refactor: improve wording”、”feat: add final sentence”)を一つにまとめてみましょう。

rebase -i を開始する

git rebase -iコマンドは、「どのコミットまで」を対象にするかを指定して実行します。
指定したコミットより新しいコミットがインタラクティブなrebaseの対象となります。

今回は最新の3つのコミットを対象にしたいので、「最初のコミット(feat: add initial README file)」の次からを対象にします。
最新のコミットから数えて対象のコミットが何番目か分かっている場合は、HEAD~Nという形式で指定できます。
今回は最新の3つのコミットを対象にするので、HEAD~3を指定します。
これは「HEADから3つ遡ったコミットまで」を意味し、結果的に最新の3つのコミットが操作対象になります。

このコマンドを実行すると、エディタが立ち上がります(使用するエディタはGitの設定によります)。エディタには、対象となるコミットが古い順に表示されます。

エディタでコミットを整理する

エディタには、各コミットの左側にコマンドが記述されています。デフォルトはpickになっており、そのコミットを採用するという意味です。

複数のコミットを一つにまとめたい場合は、まとめたいコミットの行のpicksquashまたはsに変更します。
squashはそのコミットを直前のコミットにまとめますssquashの短縮形です。

今回は最新の3つのコミット(”chore: add second line”, “refactor: improve wording”, “feat: add final sentence”)を、一番古いコミット(”chore: add second line”)にまとめたいです。
2番目と3番目のコミットのpicksに変更します。

エディタの内容を以下のように修正してください。

※一番上の行(今回まとめたいコミット群の中で一番古いもの)はpickのままにしておきます。
これがまとめたコミットの「土台」になります。

修正したら、エディタを保存して閉じます。

コミットメッセージを編集する

エディタを閉じると、Gitがrebase処理を実行し、まとめたコミットの新しいコミットメッセージを作成するためのエディタが再度立ち上がります。

このエディタには、squashに指定した各コミットのメッセージが自動的に結合された状態で表示されます。

この結合されたメッセージを編集し、まとめたコミットとして適切なコミットメッセージに書き換えます。
不要な行(特に#で始まるコメント行や、元のコミットメッセージのヘッダー部分)は削除し、最終的なコミットメッセージだけを残しましょう。

例:

メッセージを編集したら、エディタを保存して閉じます。

結果を確認する

エディタを閉じると、rebase処理が完了します。
念のため、git log --onelineコマンドでコミット履歴を確認してみましょう。

最新の3つのコミットが一つにまとまり、先ほど編集した新しいコミットメッセージになっていることが確認できるはずです。元の3つのコミットは履歴から消えています。

これで、複数のコミットを一つにまとめることができました!

おわりに

git rebase -isquashオプションを使うことで、開発途中で増えた細かなコミットを一つにまとめることができます。これは、コミット履歴を綺麗に保ち、プルリクエストのレビューを効率化するために非常に役立ちます。

  • git rebase -i <対象の範囲>でインタラクティブrebaseを開始する。
  • エディタで、まとめたいコミットのpicks (squash) に変更する。
  • 一番上のコミット(まとめる先)はpickのままにする。
  • 次に表示されるエディタで、まとめたコミットの新しいメッセージを作成する。

適切に使えば、Gitワークフローがより洗練されるはずです。ぜひ試してみてください!

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!