git rebase -i でコミットの歴史を改変したのでメモ

GitHubのリモートリポジトリにプッシュをした後でいくつか作業漏れが発覚して、本来1つのコミットに入れたかった修正内容が複数のコミットに分かれてしまいました。

そのままでも良いケースもあると思いますが、今回は1つに整理しておきたかったので、複数に分かれたコミットを後から1つにまとめるためにgit rebase -iを使いました。 その時のメモです📝

手順

前提として、今回の作業は「直近5つのコミットを1つにまとめる」です。

ローカル

まずは手元でコミットを綺麗にする。

git rebase -i HEAD~5を実行、VSCodeのエディタ側で編集画面が開く (VSCodeでコミットメッセージを編集する設定にしていることによるもの。通常であればvimでの設定になると思います)

以下スクショの通り、まとめたい分(つまりコミットとしては消える分)を全部squashにする (vimであれば、編集し終わったら:wqで保存して閉じる)

before: すべてpickの状態

after: 最新以外をsquashにする

(ちなみに、確認はできてないのですがおそらくvimだと時系列が逆で最新が一番上になっているかもしれないので、どれをsquashにするかはご注意)

保存して閉じる。

するとまたVSCodeで別の編集画面が開く (これもVSCodeでコミットメッセージを編集する設定にしていることによる)

修正前の複数のコミットが表示されている

上記の2〜5の分を丸っと消して、以下の状態で保存して閉じる。

# This is a combination of 5 commits.
# This is the 1st commit message:

ここに、最終的に残すコミットメッセージ

# Please enter the commit message for your changes. Lines starting
# 以下略

これでローカルでのコミットが整理されました! git log --onelineで、コミットが1になったことを確認しておくと安心です。

リモート

続いてリモートに反映させるために、force pushをしていく。

% git push --force

# 今回はプッシュのタイミング的に上記だけでは自動的にプッシュしてくれなかったので、以下のコマンドでプッシュしました
% git push --set-upstream origin hotfix/fix-regular-event-ended-logic

これで5つに分散していたコミットが1つにまとまりました🎉

終わりに

履歴が綺麗になって良かったです。 ただし、force pushしたこと自体は履歴に残りますし何でもかんでもまとめれば良いってわけでもないと思うので、使い所に気をつけながら活用していこうと思います🚀

歴史は変えられるが、変えたという履歴は残る