gitの履歴から特定のコミット以降の履歴だけを残してクリアする


個人で開発しているアプリケーションのgitリポジトリで履歴がグチャグチャしてしまったので、
コミット履歴をちょっと弄った時のメモです。

====================================
※注意※
gitの履歴は過去に何があったかを調べる際の手がかりになるので、
削除する理由がないのであれば残しておきましょう。
特に、他人と共同で修正しているリポジトリであれば尚更です。

履歴を残し始める直前のバージョンの状態を作る

# git clone <git URL> tmpRepo1  
# cd tmpRepo1  
# git checkout {残し始めたいコミットの直前のコミット番号}  
# rm -rf .git  
# cd ../

作業用のリポジトリを作る

# git clone <git URL> tmpRepo2  
# cd tmpRepo2  
# git checkout --orphan tmpBr

初期状態をコミットする

# rm -rf <.git以外の全て>  
# cp -r ../tmpRepo1/* .  
# git add .  
# git commit -m "Initialization"

残したいコミット履歴に対して、次の処理を過去から順に繰り返し実施する

# git cherry-pick {残したいコミット}

なお、残したいコミット履歴がマージ履歴の場合は以下の手順となる

# git cherry-pick -m 1 {残したいマージコミット}  
# git commit --allow-empty

コメントの編集画面が出るが、そのまま:wqして抜ける

意図した履歴が生成されたか確認

# git log

masterにプッシュする

# git checkout -B master  
# git push --force

一時的に作ったブランチを削除

# git branch -d tmpBr