🧹

git コミット整理術

2025/02/26に公開

はじめに

最近commit amendやらrebase -iやらの使い方を知りました。
遅すぎました。
愚かなコミットログを残してきた過去の自分への禊としてこの記事を書きます。

利用するコマンド

  • git commit --amend --no-edit
    • 1つ前のコミットに差分を入れる。--no-editでコミットメッセージを変えない。
  • git push --force-with-lease
    • localでコミットの内容を編集した時にとりあえず使う。force-with-leaseは対象ファイルのremoteの最新コミットが更新されている場合に失敗してくれる。
  • git rebase -i HEAD~N
    • コミット自体の編集(edit)
    • コミットメッセージのみの編集(reword)
    • コミットの順番の編集(vscodeのエディタで矢印操作)
    • コミットを直前のコミットに統合し、コミットメッセージを編集(squash)
    • コミットを直前のコミットに統合し、コミットメッセージを破棄(fixup)
    • コミット削除(drop)
  • git add -p
  • git rebase --abort
    • rebase操作ミスった時にリベース前の状態に戻ってくれる。
  • git commit --fixup
    • コミットをfixupにしてくれる。
  • git rebase -i --autosquash
    • fixup!で始まるコミットメッセージ名のコミットをまとめてくれる。

vscodeでの便利設定

これが俺の整理術だ!!!(ニワカ)

1つのブランチでの作業

  1. テキトーにコミットした状態(一つでも複数でも)
  2. git reset 作業開始時点のコミットハッシュ値でコミットを取り消す
  3. ちゃんとコミットする(コミット単位・コミットメッセージなどを綺麗にする)

複数のブランチ(MR)での作業

  1. ブランチAでテキトーにコミットした状態(一つでも複数でも)
  2. git reset 作業開始時点のコミットハッシュ値でコミットを取り消す
  3. ブランチAで一旦ちゃんとコミットする
  4. git switch -c ブランチBで作成&移動
  5. git cherry-pick ブランチAから取り込みたいコミットハッシュ値
  6. 4,5を繰り返す(C,D...を作る)
  7. ブランチAに移動
  8. git reset ブランチAでの変更範囲にしたいところまでのコミットハッシュ値してpush

前回のコミットに現在の差分を統合したい

  1. git commit --amend --no-edit
  2. 既にリモートにプッシュしている場合はgit push --force-with-lease

コミットを編集

  1. git stashする(未追跡ファイルも含める場合は-u)
  2. git rebase -i HEAD~N
  3. 編集したいコミットをeditする
  4. git stash apply(指定するときはstash@{N})
  5. git commit --amend --no-edit
  6. git push --force-with-lease

変更したコードをコミットに統合する(一番使うのかも)

上で書いたやつよりもコードの編集だけならささっとできる

  1. git commit --fixup コミットハッシュ値
  2. git rebase -i --autosquash コミットハッシュ値~ ~で直前のコミットハッシュ値を指定

参考:git commit --fixup が便利 #Git - Qiita

alias設定例

fixup = "!f() { git commit --fixup $1 && git rebase -i --autosquash $1~; }; f"

コミットを分割

  1. git rabase -i コミットハッシュ値
  2. edit
  3. git reset HEAD~
  4. 分割してコミット

とりあえずpush(整理ではない)

整理してる時に「ヤベっ、コミットの内容打ち消しちゃった」みたいなことがたまにあるので、リモートにコミットを保存する意味として、とりあえずpushするのは大事だと思いました。

その他、コミットする際の検討事項をなんとなく書いておく

  • レビューによる修正をコミットログに残すか
  • コミットメッセージの内容(バグやリファクタなどを識別するための接頭辞など)
  • コミットの単位
    • コミットは実現した事単位で行うといいらしい

「コミットは書く時間より、読まれる時間の方が長い」ということを意識できるといいですね。

まとめ

Alles Gescheite ist schon gedacht worden, man muss nur versuchen, es noch einmal zu denken.

Johann Wolfgang von Goethe

「どんな優れたアイデアもすでに誰かが考えている。でも、大事なのは、それをもう一度自分で考え直し、本当に理解することだ。」(意訳)

最近出会ったゲーテの言葉です。
gitのコマンドってなんでもできちゃいますね。
gitを使っていて「こんな操作がしたい」と思った時、gitを本当に理解しようとすべき時なのかもしれませんね。

最後に、私が残した愚かなコミットログを見て疲弊している方へ。
大変申し訳ございませんでした。

wwwave's Techblog

Discussion