Git rebaseでfirst commitまで遡ってまとめる
私は、git rebaseで散らかったコミットをまとめる悪事を良くやるのだが、first commitまで遡ってまとめる方法をいつも忘れるので、備忘メモとして残しておく
first commitまで遡ってまとめる
まずは、現状について
「first commit」(最初のコミット)の後に「first commit2」というコミットがあって、「first commit2」を「first commit」に統合してまとめたい
% git log commit c1477334620bf2a70ede887b4dedc52664030a18 (HEAD -> main) Author: yoshi-island <1111111+yoshi-island@users.noreply.github.com> Date: Tue Oct 11 00:13:00 2022 +0900 first commit2 commit 6be53827f5ba33e82f84a705f7228bb395d5b860 Author: yoshi-island <1111111+yoshi-island@users.noreply.github.com> Date: Mon Oct 10 23:56:30 2022 +0900 first commit
「first commit」まで遡るには「 -i –root」で指定する必要がある
% git rebase -i --root
git rebaseコマンドを打つとエディタが立ち上がるので、「first commit2」の方を「pick→fixup」に書き換える
※ 書き換え前
pick 6be5382 first commit pick c147733 first commit2 # Rebase c147733 onto b593776 (2 commands) # # Commands: ... (略) ...
※ 書き換え後
pick 6be5382 first commit fixup c147733 first commit2 # Rebase c147733 onto b593776 (2 commands) # # Commands: ... (略) ...
書き換えが終わると、「Successfully…」というメッセージが表示される
% git rebase -i --root Successfully rebased and updated refs/heads/main.
再びコミットログを確認すると、無事に統合されている
% git log commit 7f6d2fe20c2f278c388beecf3d5932f1211d8c2c (HEAD -> main, origin/main) Author: yoshi-island <1111111+yoshi-island@users.noreply.github.com> Date: Mon Oct 10 23:56:30 2022 +0900 first commit
git pushするときは普通にはpushできないと思うので
% git push origin main To https://github.com/yoshi-island/abc_work.git ! [rejected] main -> main (non-fast-forward) error: failed to push some refs to 'https://github.com/yoshi-island/abc_work.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
「-f」オプション付きでpushする(「-f」オプション付きでpushする権限が無ければ付けておく)
% git push -f origin main Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Delta compression using up to 4 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 835 bytes | 835.00 KiB/s, done. Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 To https://github.com/yoshi-island/abc_work.git + 6be5382...7f6d2fe main -> main (forced update)
途中のコミットまでまとめる
本来こちらの方がよくやる方法なのでおまけで書いておく
first commitまで遡るのではなく、途中のコミットまでまとめたいとき
今回の例では、「geko commit」「fuga commit」を「hoge commit 」に統合してまとめたい
% git log commit 8de2190379b01c53a36c7ecfff26594681bcdfe0 (HEAD -> main) Author: yoshi-island <1111111+yoshi-island@users.noreply.github.com> Date: Tue Oct 11 00:16:31 2022 +0900 geko commit commit de6196af391e466dccc6e235c8348afdfac9c74e Author: yoshi-island <1111111+yoshi-island@users.noreply.github.com> Date: Tue Oct 11 00:16:06 2022 +0900 fuga commit commit 54464c65b1d480067caf8902ebc7c28f4dc60dfa Author: yoshi-island <1111111+yoshi-island@users.noreply.github.com> Date: Tue Oct 11 00:15:54 2022 +0900 hoge commit commit 34711d593c227baa3f4144f16c9e0f3e2e567a28 Author: yoshi-island <1111111+yoshi-island@users.noreply.github.com> Date: Mon Oct 10 23:56:30 2022 +0900 first commit
3コミット分遡ってまとめるので「-i HEAD~3」を指定する
% git rebase -i HEAD~3
「geko commit」と「fuga commit」を「pick→fixup」に書き換える
※ 書き換え前
pick 54464c6 hoge commit pick de6196a fuga commit pick 8de2190 geko commit # Rebase 34711d5..8de2190 onto 34711d5 (3 commands) # # Commands: ... (略) ...
※ 書き換え後
pick 54464c6 hoge commit fixup de6196a fuga commit fixup 8de2190 geko commit # Rebase 34711d5..8de2190 onto 34711d5 (3 commands) # # Commands: ... (略) ...
書き換えが終わると、「Successfully…」というメッセージが表示される
% git rebase -i HEAD~3 Successfully rebased and updated refs/heads/main.
再びコミットログを確認すると、無事に統合されている
% git log commit 5d2a000f6af74d07aeb63391d1620c7812f53cfc (HEAD -> main) Author: yoshi-island <1111111+yoshi-island@users.noreply.github.com> Date: Tue Oct 11 00:15:54 2022 +0900 hoge commit commit 34711d593c227baa3f4144f16c9e0f3e2e567a28 Author: yoshi-island <1111111+yoshi-island@users.noreply.github.com> Date: Mon Oct 10 23:56:30 2022 +0900 first commit
git pushするときは、「first commit」にまとめたときと同様に「-f」オプション付きでpushする
% git push -f origin main
以上。