おわらない

top

gallery

blog

gitで過去のコミットを編集したり分割したりする方法

2023/04/26

TL;DL

intaractive rebaseを使いましょう。

はじめに

gitでコミット分割の方法を調べたのでメモしておきます。

手順

git logして該当コミット(とその1つ前のコミット)のSHAを確認

git log --oneline 83f52e6 (HEAD -> main) hoge f1cae65 fuga b8929a2 piyo 0fd0f4e hoge 945b51e fuga 18f60e3 piyo d6b8ce8 poyo

下から2番目の18f60e3のコミットを分割したいとします。
このとき、18f60e3,d6b8ce8の2コミットをのちに入力できるように記憶しておきます。

git rebaseで該当コミットを編集可能な状態にする

git rebase -i d6b8ce8

とするとエディタが開き、そこには

pick 18f60e3 piyo pick 945b51e fuga pick 0fd0f4e hoge pick b8929a2 piyo pick f1cae65 fuga pick 83f52e6 hoge # Rebase d6b8ce8..83f52e6 onto d6b8ce8 (6 commands) (以下省略)

のような記述がなされています。
今回いじりたいのは18f60e3なので、

edit 18f60e3 piyo pick 945b51e fuga pick 0fd0f4e hoge pick b8929a2 piyo pick f1cae65 fuga pick 83f52e6 hoge # Rebase d6b8ce8..83f52e6 onto d6b8ce8 (6 commands) (以下省略)

と文頭のpickをeditに変え、保存して閉じます。

Stopped at 18f60e3... piyo You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue

と出力されれば成功。18f60e3が編集可能となりました。

git resetで変更をワーキングディレクトリに戻す

現在、18f60e3での変更はヒストリー上にあるので、コミットし直すためにワーキングディレクトリまで引き戻します。

git reset HEAD~

変更をコミット

git add, git commitで変更をコミットします。
ここでコミットを小分けにすることで、当初の目的であるコミット18f60e3の分割が叶います。

git rebase --continueでHEADにチェックアウトして終了

コミットが完了したら、rebaseで編集モードを終了し、HEADへチェックアウトします。

git rebase --continue Successfully rebased and updated refs/heads/main.

過去のコミットを分割しなおすことができました。

参考