5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

gitのコミット履歴の順番を入れ替えてまとめる方法

Last updated at Posted at 2023-12-15

年末の大掃除やってますか!

大掃除って大変ですよね。嫌いです。普段からやっておけよって話なんですよね。
という事で、今回は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以降という指定が必要になりますので、以下となります。

修正したいコミットより1つ下を指定してるのがポイント
$ git rebase -i 2794f6e  # A ADDのコミット番号を指定してますね!

するとこうなるはず。

image.png

git logの時とは逆順に並んでるので注意してくださいね!

これを以下のように修正します。

image.png

squashとは1つ前のコミットにこの修正を混ぜ込むという命令です。
私の場合は、vimで作業しているので、:wpで修正を保存します。

するとコミットメッセージどうしますか?という画面が開きます。

image.png

この時、メッセージの修正が不要ならそのまま: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がよりよいレコメンドや精度の高いコード生成をするためにも、こういった履歴は綺麗にして備えておくといいんじゃないでしょうか。

以上!お疲れ様でした!

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?