普段開発をしていて「少しコミット細かすぎるからまとめておいてね」と言ったり言われたりするケースが多いので、
rebaseとスカッシュマージを使用したコミットのまとめ方について書き記しておく。
結論
- rebaseもスカッシュマージ(squash merge)も複数のコミットを1つにまとめることができるコマンドの1種
- rebaseは複数のコミットをまとめることができる
- スカッシュマージは作業ブランチと現在のブランチの差分をまとめて一つのコミットとして現在のブランチにマージする
rebase
- rebaseを使用することで複数のコミットをまとめて新しいコミットを作成することができる
- 直近の連続したコミットであればまとめることができるが、rebaseしたいコミットの中に他の人のコミットがあった場合、rebaseしてしまうと自分がコミットしたことになってしまうので注意
- 基本的には自分の作業ブランチで細かく分けすぎたコミットを統合する目的で使用する
rebaseでコミットをまとめる方法
1. git logでまとめたいコミットを確認
- 今回以下の3つを1つにまとめたいとする
pick 12345 サンプルコミットC
pick 67890 サンプルコミットB
pick abcde サンプルコミットA
2. git rebase -i HEAD~[まとめたいコミットの数]
コマンドを実行する
-
今回の場合であれば、
git rebase -i HEAD~3
となる -
vscodeでやっていれば下記のような画面が自動で開く
-
もしターミナルが開かれた場合、デフォルトエディタがターミナルになっているのでこちらの記事を参考にvscodeに設定する
3. 各コミットメッセージの左側のプルダウンからrebaseでどのような処理を行うか選択する
-
基本的にはコミットをまとめたい時に使用すると思うので、squashかfixupのどちらかを選ぶと思われる
- コミットをまとめることで作成された新しいコミットのコミットメッセージを変更させたいときはsquashを選択する
- 基本squashで良いと思われる
- 一番下にあるコミットはsquashやfixupができない
- ベースとなるコミットでそのコミットに対しfixupやsquashされたコミットが統合されるから
コマンド 説明 pick 何もしない。統合元となる reword コミットメッセージをまとめて変更する edit 過去のコミットを修正する(該当箇所でrebaseを一時停止する) squash 過去のコミットを統合する(コミットメッセージを変更する場合) fixup 過去のコミットを統合する(コミットメッセージの変更が不要な場合) drop 過去のコミットを削除する - コミットをまとめることで作成された新しいコミットのコミットメッセージを変更させたいときはsquashを選択する
4. コミットメッセージを好きなように変更する
スカッシュマージ(squash merge)
- マージと名前についている通り、作業ブランチと現在のブランチの差分があった場合に作業ブランチから現在のブランチにまとめてコミットする手法
- こちらもコミット履歴が書き変わってしまうので、直近の変更が自分の連続したコミットである場合に使用するのが無難
スカッシュマージでコミットをまとめる方法
- 作業ブランチでまとめたいコミットをgit logで確認
- 作業ブランチからマージしたいブランチへ移動
-
git merge —squash [ブランチ名]
を実行 - 現在のブランチに変更したファイルが移動してくるので、それをコミットしてpush
- 作業ブランチは不要であれば削除、今後も使用するのであれば移動してマージをしておく
- コンフリクトしないようにするため
まとめ
普段コミットをまとめる際にはrebaseしか使ったことがありませんでしたが、
今回両方使ってみて単純に作業ブランチでコミットをまとめるのであればrebaseが使いやすいなと感じました。
rebaseだとvscodeであればコマンドを実行した際、ファイルが自動で開いたり、squashやfixupのコマンドもプルダウンから選択するだけでわかりやすく、コミットメッセージの書き換えも簡単に行うことができました。