git rebase -iでのsquash・fixupを用いたコミットログ整形手法

Git DevOps Workflow CLI
結論

git commit --fixupgit 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 rebasepush --force による履歴破壊事故

git rebase はコミットハッシュ値をすべて新しく再生成(書き換え)する不可逆操作です。

すでに GitHub などにプッシュされ、チームメンバーがチェックアウトして作業している共有ブランチに対して git rebase -i を実行し、git push --force を強行すると、他メンバーのローカルリポジトリとの同期が不整合(Diverged Branch)を起こし、他人の作業コミットが抹消・上書き消失する大障害 が発生します。


安全な整形手順

  1. コミット整理は、まだリモートへプッシュしていない個人のローカル作業ブランチでのみ 実行する
  2. 修正コミット作成時は git commit --fixup <対象ハッシュ> を使い、メッセージに fixup! 接頭辞を自動付与する
  3. git rebase -i --autosquash HEAD~N を実行し、自動で対象コミット直下に配置された fixup の todo リストを確認して保存する
  4. もし途中でコンフリクト(衝突)が発生して泥沼化した場合は、躊躇せず git rebase --abort を呼び出し、rebase 実行前の状態に完全安全復帰させる