🧹
git コミット整理術
はじめに
最近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
- ファイル単位ではなく、行単位でstageにあげる作業が可能。あんまり使わない。
- git rebase --abort
- rebase操作ミスった時にリベース前の状態に戻ってくれる。
- git commit --fixup
- コミットをfixupにしてくれる。
- git rebase -i --autosquash
- fixup!で始まるコミットメッセージ名のコミットをまとめてくれる。
vscodeでの便利設定
- 以下の設定をするとvscodeのエディタを使えて楽。
- GitのEditorをVSCodeに変更する #ATOM - Qiita
これが俺の整理術だ!!!(ニワカ)
1つのブランチでの作業
- テキトーにコミットした状態(一つでも複数でも)
-
git reset 作業開始時点のコミットハッシュ値
でコミットを取り消す - ちゃんとコミットする(コミット単位・コミットメッセージなどを綺麗にする)
複数のブランチ(MR)での作業
- ブランチAでテキトーにコミットした状態(一つでも複数でも)
-
git reset 作業開始時点のコミットハッシュ値
でコミットを取り消す - ブランチAで一旦ちゃんとコミットする
-
git switch -c ブランチB
で作成&移動 git cherry-pick ブランチAから取り込みたいコミットハッシュ値
- 4,5を繰り返す(C,D...を作る)
- ブランチAに移動
-
git reset ブランチAでの変更範囲にしたいところまでのコミットハッシュ値
してpush
前回のコミットに現在の差分を統合したい
git commit --amend --no-edit
- 既にリモートにプッシュしている場合は
git push --force-with-lease
コミットを編集
-
git stash
する(未追跡ファイルも含める場合は-u) git rebase -i HEAD~N
- 編集したいコミットをeditする
-
git stash apply
(指定するときはstash@{N}) git commit --amend --no-edit
git push --force-with-lease
変更したコードをコミットに統合する(一番使うのかも)
上で書いたやつよりもコードの編集だけならささっとできる
git commit --fixup コミットハッシュ値
-
git rebase -i --autosquash コミットハッシュ値~
~で直前のコミットハッシュ値を指定
参考:git commit --fixup が便利 #Git - Qiita
alias設定例
fixup = "!f() { git commit --fixup $1 && git rebase -i --autosquash $1~; }; f"
コミットを分割
git rabase -i コミットハッシュ値
- edit
git reset HEAD~
- 分割してコミット
とりあえずpush(整理ではない)
整理してる時に「ヤベっ、コミットの内容打ち消しちゃった」みたいなことがたまにあるので、リモートにコミットを保存する意味として、とりあえずpushするのは大事だと思いました。
その他、コミットする際の検討事項をなんとなく書いておく
- レビューによる修正をコミットログに残すか
- コミットメッセージの内容(バグやリファクタなどを識別するための接頭辞など)
- コミットの単位
- コミットは実現した事単位で行うといいらしい
「コミットは書く時間より、読まれる時間の方が長い」ということを意識できるといいですね。
まとめ
Alles Gescheite ist schon gedacht worden, man muss nur versuchen, es noch einmal zu denken.
Johann Wolfgang von Goethe
「どんな優れたアイデアもすでに誰かが考えている。でも、大事なのは、それをもう一度自分で考え直し、本当に理解することだ。」(意訳)
最近出会ったゲーテの言葉です。
gitのコマンドってなんでもできちゃいますね。
gitを使っていて「こんな操作がしたい」と思った時、gitを本当に理解しようとすべき時なのかもしれませんね。
最後に、私が残した愚かなコミットログを見て疲弊している方へ。
大変申し訳ございませんでした。

株式会社ウェイブのエンジニアによるテックブログです。 弊社では、電子コミック、アニメ配信などのエンタメコンテンツを自社開発で運営しております! ve.jp/service/
Discussion