標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

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.

参考文献