yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。
GitHub-Mark-120px-plus

Git rebaseでfirst commitまで遡ってまとめる

2022-10-11

私は、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

以上。