Git

【Git】複数コミットをまとめてrevertする方法

この記事でわかること

  • 特定のコミットまでの全てのコミットをまとめてrevertする方法
  • revertコミットをまとめる方法

特定のコミットまでの全てのコミットをまとめてrevert

数個程度のコミットでしたら普通に

git revert HEAD^

とか

git revert <コミットID>

とかでいいのですが、100コミットとかあった場合は一つ一つやっていたら日が暮れてしまいます

まとめてrevertするには以下のコマンドを使います

git revert HEAD...HEAD~100 --no-edit
  • HEAD...HEAD~100 ... 「今いるコミット」から「100個前のコミット」までを指定
  • --no-edit ... revertコミットのメッセージを編集しない

例えば↓のようなコミット履歴でcommit1~3全てrevertしたい場合は

c59f92d (HEAD -> test) commit3
91cfe7b commit2
32349cf commit1
git revert HEAD...HEAD~3 --no-edit

これで直近3つのコミットを全てrevertできます

e471f93 (HEAD -> test) Revert "commit1"
20f3821 Revert "commit2"
35c18ae Revert "commit3"
c59f92d commit3
91cfe7b commit2
32349cf commit1

が、このままだとrevertコミットが大量にできて履歴が見づらくなってしまうのでrevertコミットをまとめていきます

revertコミットをまとめる

これはrevertコミットに限った話ではないですが

コミットをまとめたいときは以下のコマンドを使います

git rebase -i HEAD~3
  • -i ... エディタを開いて編集できる
  • HEAD~100 ... 直近何個のコミットを編集するかを指定

このコマンドを打つと以下のような画面が出てきます

rebase_編集前.png

ここでまとめるベースのコミットをpickにしてそのコミットにひっくるめたいコミットはsquashにして閉じると

rebase_編集後.png

コミットメッセージの編集画面が出てくるので

rebase_メッセージ編集前.png

適当に編集して

rebase_メッセージ編集後.png

閉じると

c3a9193 (HEAD -> test) commit1~3をrevert
c59f92d commit3
91cfe7b commit2
32349cf commit1

revertでたくさんできたコミットを一つにまとめられます

ちなみに、rebaseしたときにpickとかsquashとか書きましたが、それぞれpsみたいに頭文字だけに省略もできます

-Git