【Gitの美学】fixupとautosquashで「Typo修正コミット」を一瞬で過去の履歴に統合するテクニック
「PRを作成したら、コミット履歴が『WIP』『タイポ修正』『修正その2』で埋め尽くされている……」
機能開発に集中していると、ついつい細かな修正コミットが乱立してしまうものです。しかし、そのままの状態でメインブランチにマージしてしまうと、後からバグが発生した際に「どのコミットで何の変更が行われたのか」を追うのが非常に困難になります。
今回は、開発中に発生した微修正コミットを、過去の該当コミットへ全自動で統合(Squash)してくれるGitの隠れた名機能 git commit --fixup と git rebase -i --autosquash の使い方を徹底解説します。
なぜ普通の git rebase -i だけでは面倒なのか?
従来、コミット履歴を整理するには git rebase -i HEAD~5 などのインタラクティブ・リベースを実行し、エディタ上でコミットの順番を上下に入れ替えたり、pick を squash や fixup に手動で書き換えたりする必要がありました。
この作業は、対象のコミット数が多いと「どのハッシュ値に統合すべきか」を探すのが大変で、コンフリクトの原因にもなりがちでした。
--fixup オプションを使えば、「どのコミットに対する修正か」をコマンド実行時に指定するだけ で、Gitが再配置と統合の指示書を全自動で組み立ててくれます。
処理の流れ比較
graph TD
A["開発中にタイポや微修正を発見"] --> B["git commit --fixup (対象コミットハッシュ) を実行"]
B --> C["Gitが fixup! コミットを自動作成"]
C --> D["キリの良いタイミングで git rebase -i --autosquash を実行"]
D --> E["Gitが修正コミットを過去の対象コミットの直下へ自動移動&統合"]
E --> F["無駄な修正コミットが消え、美しい1つのコミットに合体完了"]
実践ステップ:--fixup と --autosquash の使い方
具体的なシナリオに沿って、コマンドの実行手順を見ていきましょう。
シナリオ:過去の機能実装コミットにタイポが見つかった場合
まず、git log --oneline で現在のコミット履歴を確認します。
a1b2c3d (HEAD -> feature/user-auth) Add user authentication logic
f9e8d7c Add login form component
1a2b3c4 Initial commit
トップの a1b2c3d ("Add user authentication logic") のコードにタイポがあることに気づいたとします。
1. 修正ファイルをステージングし、--fixup 付きでコミット
修正箇所のコミットハッシュ(ここでは a1b2c3d)を指定してコミットします。
git add src/auth.js
git commit --fixup a1b2c3d
このコマンドを実行すると、Gitは以下のような特別なコミットメッセージを自動生成します。
e5f6g7h (HEAD -> feature/user-auth) fixup! Add user authentication logic
a1b2c3d Add user authentication logic
f9e8d7c Add login form component
2. --autosquash 付きで rebase を実行
修正作業が区切りを迎えたら、以下のコマンドを実行します。
git rebase -i --autosquash f9e8d7c^
コマンドを実行すると、VS Code等のエディタが開きますが、すでに以下のように fixup の並び替えと指示コマンドが自動配置 されています。
pick a1b2c3d Add user authentication logic
fixup e5f6g7h fixup! Add user authentication logic
# Rebase f9e8d7c..e5f6g7h onto f9e8d7c
ユーザーは何も編集せずにエディタをそのまま保存して閉じる(:wq / Ctrl+W)だけで、リベースが瞬時に完了します!
git log --oneline を再度確認すると、fixup! コミットが見事に消え去り、元の a1b2c3d に綺麗に修正内容が統合されています。
開発をさらに爆速化する Git Alias の設定
毎回 --autosquash をタイピングするのは手間です。.gitconfig にエイリアスを設定し、git rebase 実行時に常に --autosquash が有効化されるように設定しておきましょう。
[rebase]
# rebase -i 実行時に常に autosquash を有効化
autoSquash = true
[alias]
# git fixup <commit-hash> で実行できるようにエイリアス設定
fixup = commit --fixup
この設定を追加しておけば、以下の2コマンドだけでコミット整理が完結します。
# 修正の作成
git fixup a1b2c3d
# 自動統合の実行
git rebase -i origin/main
導入して実感したチーム開発への貢献
- レビューアからの圧倒的感謝 PRのコミット履歴が「機能追加」「テスト追加」のように意味のある単位で整然と並ぶため、レビューアが意図を理解しやすくなり、承認までの速度が向上しました。
git bisect(バグ特定)の精度向上 後日バグが発生した際にgit bisectで過去のコミットを遡る際、壊れた中途半端なWIPコミットが存在しないため、原因特定がスムーズになりました。- 無駄なストレスからの解放
開発中に「あ、ここも直さなきゃ」と思った時に、無理に
git commit --amendで作業を中断されることなく、テンポよく作業を進められるようになりました。
まとめ:綺麗なコミットログはエンジニアの「美徳」
コードそのものの品質だけでなく、コミット履歴の美しさもエンジニアの技術力を表す指標の一つです。
--fixup と --autosquash は、作業中の自由度(こまめなコミット)と、公開時の美しさ(洗練された履歴)を両立させてくれる最高の機能です。
次回の機能開発から、ぜひこのテクニックを実践してみてください!