git履歴の先頭に、後から「空commit」を割り込ませる

本件を実行する前に git clone でバックアップを取っておきましょう

あらかじめ、全commitの履歴を cherry-pick するスクリプトを作成しておく

git log --pretty="format:%H" | gawk '/./{ line[i++]=$0 } END{ while(--i >= 0){ print "git cherry-pick ",line[i]} }' > pick.sh
  • /./ はEOF付近にできがちな空行を排除するためのもの
  • tac を使った方が短くなるが、git for Windows の MSYS には tac が入っていないようなので、gawk だけ済ます

これを実行すると、pick.sh が作成される

git cherry-pick ae733b6a64bba949af88276ade162b551d7ced1d
git cherry-pick b7e8e845b979bf60a94520692ce627f471d3a356
git cherry-pick 0bc25ff7d5a7fff24b898373aa5c2dbe8fa0a557
git cherry-pick edeb710e551c12ded01968d766856e3dd6fdc279
 :(略)

最初のcommitの直後に移動する。

git checkout ae733b6a64bba949af88276ade162b551d7ced1d

この状態で新ブランチtmpを作成する

git branch tmp
git checkout tmp

新ブランチ tmp には最初のcommitだけが残っているので、これを削除する。

git update-ref -d HEAD
git reset --hard

空ブランチを作成する。

git commit -m "null" --allow-empty

他の commit を全部復元する

sh pick.sh | more

masterブランチと、新ブランチtmp と入れ替える

git branch -m master old_master
git branch -m tmp master

Ok.

参考文献