年末の大掃除やってますか!
大掃除って大変ですよね。嫌いです。普段からやっておけよって話なんですよね。
という事で、今回はgitの方も普段から綺麗にしておくやり方をまとめておこうと思います。具体的には
- コミットの順番を入れ替える
- コミットを1つにまとめる
こんな事をする作業になります。
この説明は、マージコミットはまたいでいない前提の手順です。
個人の作業用ブランチでの実施に留める事をオススメします。
また、マージコミットを跨いだ作業は他の人の迷惑にもなるので推奨はされていません。
でも、これそもそも掃除の必要ある?なんで大事なの?という所から話そうと思います。
なぜcommit履歴を綺麗にするのか
レビューがしやすいから
理由の1つはレビュワーの事を考えてです。
コードレビューしてくれる人は「なんでここ書き換えたんだろ?」と疑問を抱いた時にコミットメッセージやコミット履歴を見て経緯を辿ったりします。
そのためにもコミットメッセージやコミット履歴は綺麗にしておく事で適切で効率的なレビューが実施出来ます。
将来の自分のため
3ヶ月前に自分がコミットした履歴を見てみましょう。どういった意図で、なぜそれを書き換えたのか理解出来るでしょうか?
過去になればなる程、過去の自分は他人と思えるぐらいに案外理解しにくいものです。
「類似修正する際に参考にしよう」とか「バグ原因を究明する」などの理由で見返す事があるので、綺麗にしておきましょう!
では具体的な例をもってやり方を解説していきます!
コミット履歴の整理のやり方
ログを確認する
まずはコミット履歴を確認します。
$ git log --oneline
4bb3770 (HEAD -> main) B UPDATE
7d936f6 D ADD
ab6a017 C ADD
065d23a B ADD
2794f6e A ADD
git log
は上が最新のコミット、下が古いコミットです。なので、「ABCDの順番で追加されて、Bが更新されたのね」というのがわかります。
1つの実装修正タスクの中で、動作確認とったけど、Bにdebugメッセージが残ってた!とかバグがあった!が後からわかって更新する事ありますよね!
では実際に 最後のB UPDATE
のコミットを移動させてB ADDのコミットにまとめてみましょう。
順番を入れ替えてスカッシュする
コミット履歴を変更する場合使うコマンドはgit rebase
です。インタラクティブに実行する場合は-i
を指定し、修正したい範囲として一番古いコミットを指定します。
よくみるgit rebase -i HEAD~~~~~
とかgit rebase -i HEAD~5
とかはHEADから5個前のコミット以降を修正したいって意味になりますね!
今回はB ADD
のコミットにB UPDATE
を入れたいので、A ADD
以降という指定が必要になりますので、以下となります。
$ git rebase -i 2794f6e # A ADDのコミット番号を指定してますね!
するとこうなるはず。
git log
の時とは逆順に並んでるので注意してくださいね!
これを以下のように修正します。
squash
とは1つ前のコミットにこの修正を混ぜ込むという命令です。
私の場合は、vim
で作業しているので、:wp
で修正を保存します。
するとコミットメッセージどうしますか?という画面が開きます。
この時、メッセージの修正が不要ならそのまま:wp
ですが、
今回はメッセージをB ADD(UPDATE含む)
にしたいので、上のメッセージを編集し、下のメッセージの行は削除して:wp
とします。
再度ログを確認する
するとこうなったんじゃないでしょうか!
$ git log --oneline
aac2087 (HEAD -> main) D ADD
5559dc1 C ADD
1b92ff0 B ADD (UPDATE含む)
2794f6e A ADD
綺麗ですね!
git show 1b92ff0
とすると、Bのコミットにちゃんと混ぜ込められたのも確認できますよ!
まとめ
みんながルールを守ってコミットを整理するとgitlabとかのgraphって本当にきれいになります。
昨今は自動化やコードのAI生成が盛んになってきていますが、AIがよりよいレコメンドや精度の高いコード生成をするためにも、こういった履歴は綺麗にして備えておくといいんじゃないでしょうか。
以上!お疲れ様でした!