🔖

Gitでコミットをひとつにまとめる方法

に公開

はじめに

Gitで開発していると、作業中に何度もコミットしてしまい、
後から 「コミットを1つにまとめたい」と思うことがあります。

私自身も最初はやり方がわからず、
amendrebase を使って試行錯誤してきました。

本記事では、複数のコミットを1つにまとめる方法を紹介します。
実際のコマンド例と一緒に、注意点も添えて解説します。

方法①:直前のコミットにまとめる(--amend

git add .
git commit --amend
  • 最後のコミットに変更を上書きします。
  • git commit の後に「これも一緒にまとめたい」というときに便利です。

❗ 注意

  • 既にpush済みのコミットを--amendした場合は強制pushが必要です。
git push --force-with-lease

方法②:複数のコミットをまとめる(git rebase -i

git rebase -i HEAD~3

直近3つのコミットをまとめたいときの例です。

ステップ①:picksquash に変更する

pick ff1c4e9 最初のコミット
pick bc9f8e1 2つ目のコミット
pick f8ae4ce 3つ目のコミット

この状態から、2つ目・3つ目のコミットを1つ目にまとめるように変更します。

pick ff1c4e9 最初のコミット
squash bc9f8e1 2つ目のコミット
squash f8ae4ce 3つ目のコミット

編集後、保存して終了するとコミットメッセージの編集画面に移ります。


💡 補足:エディタ操作は環境により異なります。

エディタ 編集開始 削除 保存&終了
vim(macなど) i → 編集 dd Esc:wq
nano(Windowsなど) そのまま入力可 Ctrl + K Ctrl + OEnterCtrl + X
GUI系(VS Codeなど) そのまま入力 Backspace など 保存して閉じる

使用エディタは git config core.editor で確認できます。


ステップ②:コミットメッセージを1つにまとめる

編集画面には、まとめる対象のコミットメッセージが全て表示されます。

変更前の状態

# This is a combination of 3 commits.
# This is the 1st commit message:

最初のコミット

# This is the commit message #2:

2つ目のコミット

# This is the commit message #3:

3つ目のコミット

変更後の例(vimの場合)

# This is a combination of 3 commits.
# This is the 1st commit message:
ログイン機能の実装完了

- フォームの追加
- バリデーションの実装
- セッション保存処理の追加

コメント(#)以外の行がそのまま新しいメッセージになります。
複数行OKなので、分かりやすく整理して書き換えましょう。


❗ 注意

  • rebase は履歴を書き換える操作なので、push済みなら強制pushが必要です。
git push --force-with-lease

方法③:全てのコミットを1つにまとめたい場合

個人開発や試作ブランチなど、履歴が要らない場合には
ブランチ内の全コミットをまるごと1つにまとめることも可能です。

git reset --soft $(git rev-list --max-parents=0 HEAD)
git commit -m "ひとつにまとめたコミット"

解説

  • --soft リセットで 作業内容は保持したまま、ステージング状態に戻す
  • rev-list --max-parents=0 HEAD は「最初のコミット」を取得するコマンド
  • 全ての変更を新しいコミットとしてまとめ直すことが可能

まとめ

方法 目的 コマンド 注意点
amend 直前のコミットを修正 git commit --amend push済みなら--force-with-lease
rebase 複数のコミットをまとめる git rebase -i HEAD~n push済みなら強制push
reset + commit 全てを1つにまとめる git reset --soft $(git rev-list --max-parents=0 HEAD) 履歴が書き換わるので注意(チーム作業では慎重に)

おわりに

コミット履歴を整えると、
チーム開発でもレビューしやすく、あとから履歴を見るときもすっきりします。

特に amendrebase は怖く感じるかもしれませんが、慣れてくると便利です。

本記事が参考になれば幸いです。

Discussion