git rebase -iでのsquash・fixupを用いたコミットログ整形手法
Git DevOps Workflow CLI
結論
git commit --fixup と git rebase -i --autosquash でメッセージを自動統合します。
# Git SCM公式仕様:autosquash を用いた全自動コミット整理手順
# 1. 過去のコミット (hash: a1b2c3d) を修正するコミットを準備
git commit --fixup a1b2c3d
# 2. 自動並び替え・fixup 適用でインタラクティブ rebase 起動
git rebase -i --autosquash HEAD~5
Git SCM公式仕様:3大コミット整形アクション
Git SCM公式ドキュメント(git-scm.com/docs/git-rebase)で定義されているインターアクティブ rebase のアクションです。
| アクション | コミット内容の扱い | コミットメッセージの扱い |
|---|---|---|
pick (p) | コミットを採用する | 変更なし(そのまま残す) |
squash (s) | 直前のコミットへ結合する | 両方のメッセージを結合して編集可能 |
fixup (f) | 直前のコミットへ結合する | このコミットのメッセージは破棄する |
実際に起こる障害:共有ブランチへの git rebase と push --force による履歴破壊事故
git rebase はコミットハッシュ値をすべて新しく再生成(書き換え)する不可逆操作です。
すでに GitHub などにプッシュされ、チームメンバーがチェックアウトして作業している共有ブランチに対して git rebase -i を実行し、git push --force を強行すると、他メンバーのローカルリポジトリとの同期が不整合(Diverged Branch)を起こし、他人の作業コミットが抹消・上書き消失する大障害 が発生します。
安全な整形手順
- コミット整理は、まだリモートへプッシュしていない個人のローカル作業ブランチでのみ 実行する
- 修正コミット作成時は
git commit --fixup <対象ハッシュ>を使い、メッセージにfixup!接頭辞を自動付与する git rebase -i --autosquash HEAD~Nを実行し、自動で対象コミット直下に配置されたfixupの todo リストを確認して保存する- もし途中でコンフリクト(衝突)が発生して泥沼化した場合は、躊躇せず
git rebase --abortを呼び出し、rebase 実行前の状態に完全安全復帰させる