手順
例えば、3 つ前のコミットに戻ってまとめたいとき
# 3つ前のコミットに戻す(変更はステージングエリアに残る)
git reset --soft HEAD~3
# 新しいコミットを作成
git commit -m "feat: hogehoge"
# force-push
git push --force-with-lease origin HEAD
想定されるケース
1. コミット履歴の整理
- 細かいコミットが積み重なって履歴が汚くなった
- 開発中の試行錯誤のコミットをまとめたい
- レビュー前にコミットを整理したい
2. 機能単位でのコミット分割
- 1 つの機能実装が複数のコミットに分かれている
- 関連する変更を 1 つのコミットにまとめたい
3. 作業中のコミットの整理
- 作業中の一時的なコミット("WIP"、"fix typo"など)を本格的なコミットにまとめる
- デバッグ用のコミットを削除したい
補足
--soft
について
git reset --soft
は、コミットを取り消すが変更内容はステージングエリアに残すオプションです。
-
--hard
: 変更内容も完全に削除 -
--mixed
(デフォルト): 変更内容はワーキングディレクトリに残す(ステージングエリアからは削除) -
--soft
: 変更内容はステージングエリアに残す
つまり、--soft
を使うと「コミットだけ取り消して、変更はそのまま次のコミットに含められる」状態になります。
--force-with-lease
について
git push --force-with-lease
は、通常の--force
より安全なオプションです。
-
--force
: 強制的にプッシュ(他の人の変更を上書きしてしまう可能性) -
--force-with-lease
: リモートブランチが予想通りの状態の時のみプッシュ
--force-with-lease
を使うと、他の人が同時にプッシュしていた場合は失敗するため、意図しない変更の上書きを防げます。
注意点
- 既にプルリクエストが Review Ready のとき: レビュワーの混乱を招くので使うべきではない。あくまでレビュー依頼前の手順。
- CI/CD: コミットハッシュが変わるため、CI のキャッシュなどに影響する可能性