複数のコミットをひとつのコミットとしてまとめる方法について記載します。
この手順を行う前に、編集中のファイルをcommit、pushしておきます。(もしくは削除)
下記コマンドでコミットの状態を確認しておきます。
git log --oneline -n <件数>
コミットをまとめるには、git rebase -i HEAD~n
を実行します。
n
には直近からコミットをまとめる件数を指定します。
下記のようにコマンドを実行すると、コミットの古い方から順番に履歴が出力されます。
git rebase -i HEAD~8
# コミットが古い方が上。新しい方が下。
pick ecf0c15 test
pick 6855412 xxx処理のモック化対応
pick 5480880 xxxのテスト作成
pick caf7335 xxxのテストコード作成
pick 8b73497 誤記修正
pick 5f135a6 設定値に変更
pick 389312b go fmt 実行
pick f66c152 コミット実行
# Rebase b82de03..f66c152 onto b82de03 (8 commands)
#
履歴一番古いコミット「ecf0c15 test」に他のコミットをまとめます。そうするには「pick f66c152」のpickをr
に、それ以外のコミットのpickをf
に修正します。
:%s/pick/f/g
を実行するとpickの部分をfに置換できます。
※「ecf0c15 test」より新しいコミットに「r」や「p」を設定すると処理がエラーとなってしまう。基本的に古いコミットを基準に新しいコミットをまとめるイメージでいれば上手くいく。
# pickを書き換える
r ecf0c15 test
f 6855412 xxx処理のモック化対応
f 5480880 xxxのテスト作成
f caf7335 xxxのテストコード作成
f 8b73497 誤記修正
f 5f135a6 設定値に変更
f 389312b go fmt 実行
f f66c152 コミット実行
# Rebase b82de03..f66c152 onto b82de03 (8 commands)
#
修正が完了したらesc
→:qw!
を入力して保存します。
余談ですが上記以外にも次の設定が行えます。
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
コミットをまとめた先の「ecf0c15 test」のコミットメッセージを変更するようviが立ち上がります。
test # ← ここを書き換えることでコメントを修正できる
# Please enter the commit message for your changes. Lines starting
今回「テスト」を 「コミットまとめ」に修正します。
コミットまとめ # ← コメントを修正
# Please enter the commit message for your changes. Lines starting
修正が完了したらesc
→:qw!
を入力して保存します。
git log --oneline -n 表示件数
コマンドでコミットの状況を確認します。すると上記でf
と設定したコミットが消え、先ほど設定した「コミットまとめ 」のメッセージのみが表示されていることを確認できます。
これでローカルのコミットをまとめられました。
git log --oneline -n 3
882151a (HEAD -> feature/XXX) コミットまとめ
b82de03 hogehoge
1607b8c fugafuga
あとはgit push -f
を実行すればリモートにも変更が適用されます。
git push -f