アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

Git コミットを整理しよう!便利な git rebase -i の使い方

f:id:otoyo0122:20201024102937p:plain:w300

Gitを使って開発していると「あ、このコミットさっきのコミットにまとめたかったな…」ってことがあります。

コミットを整理することは、レビュアーの負担軽減にもなるので大切です。

そこでこのエントリでは、ブランチをPushする前に git rebase -i を使ってコミットを整理する方法を紹介します。

git rebase -i の使い方

コミットを整理するにはgit rebase -i <COMMIT_ID>を使うと便利です。

例えば次のような履歴があったとします。

  • Fix view
  • Add controllers
  • Add routing
  • Add views

直近のFix viewコミットは4つ前のAdd viewsコミットとまとめてしまいたいです。

そんなときはgit rebase -i HEAD~4とします(Add viewsのコミットID~1 を指定しても良いです)。

すると、下記のような内容が書かれたエディタが立ち上がります。

pickから始まる行が1コミットを表しています。git logとは逆で、下が新しいコミットになっています。

pick xxxxxxxxx Add views
pick xxxxxxxxx Add routing
pick xxxxxxxxx Add controllers
pick xxxxxxxxx Fix view

これを次のように編集します。

Fix viewのコミットをAdd viewsの下に移動し、pickfixupに変更します。

pick xxxxxxxxx Add views
fixup xxxxxxxxx Fix view
pick xxxxxxxxx Add routing
pick xxxxxxxxx Add controllers

編集したら保存して終了します。

成功するとコミットがまとめられ、下記のようなメッセージが表示されます。

git loggit diffで確認するとコミットがまとめられたことを確認できます。

Successfully rebased and updated refs/heads/xxx.

fixupの意味

今回は行の順番を変えてfixupコマンドを使いましたが、実はgit rebase -iで使えるコマンドの説明はエディタを開いた際の下部に書かれています。

# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#

fixupの説明を見ると「コミットメッセージを破棄するsquash」と書かれています。

fixupではコミットメッセージは編集できませんでしたが、編集したい場合はsquashを使います。

個人的には他のコマンドはほぼ使いません。コミットメッセージを編集するためにたまにeditを使う程度でしょうか。でもeditよりrewordの方が便利そうですね。

These lines can be re-ordered; they are executed from top to bottom.

とあるように、行を入れ替えるとコミットの順番を変えることができます。また、行を削除するとコミットを消すこともできます。

ぜひgit rebase -i使いこなしてコミットを整理してみてください。

以上です。

このエントリでは、ブランチをPushする前に git rebase -i を使ってコミットを整理する方法を紹介しました。