こんなことをすることになった経緯
- branchBをベースにつくったbranchAがあります。
- branchAでは何回もCommit(& Push)をしました。
- branchBの変更を取り込むためにbranchBをbranchAへ何度かMargeをしました。
- とある日・・・branchDをベースにしなければならないことが発覚しました
- branchDをベースにしてbranchCを造ることになりました
- branchA : 何回もコミットとbranchBをマージをしたブランチ
- branchB : branchAのベースになったブランチ
- branchC : buranchAのコミットだけをチェリーピックしたいブランチ
- branchD : branchCのベースにしたいブランチ
1. branchAをCheckoutする
$ git checkout branchA
2. コミットのハッシュとコメントをCSVに出力する
- コミットのハッシュとコメントを確認する
- ブランチが開始されたCommitを特定する
- 特定したコミットの日付を確認する
- 特定したコミットの日付以降のハッシュとコメントをCSVに出力する
$ git log --pretty=onelinere
7c4a... {Commitコメント1}
c037... Merge branch 'master' of ....
3bb5... {Commitコメント2}
...<省略>...
$ git log 1201...
commit 1201...
Author: xxxxxx
Date: Sun Apr 16 17:32:17 2017 +0900
{Commitコメント}
$ git log --pretty=onelinere --after='2017-04-16 17:32:00' > cherry-pick.csv
3. CSVを加工してcherry-pick用コマンドを造る
- CSVをExcelで開く
- コメントが「Merge branch~」になっている行(Marge)を削除する
- 列を左に挿入して降順で番号をつける
- 古いCommit順に並べるために、挿入した番号の昇順でソートする
- 連番とコメントを削除してハッシュのみ残す
- ハッシュの隣の列に「="git cherry-pick "&{ハッシュのセル}」を入れて一気にコマンドを造る
4. branchCを造る
- branchDをチェックアウトする
- branchCを造る
$ git checkout branchD
$ git checkout -b branchC
5. branchCにbranchAのCommitだけcherry-pickする
-
- で造ったcherry-pickコマンドを次々に実行する
- 途中でコンフリクトしたら解決して再度実行していく
$ git cherry-pick 1201...
$ git cherry-pick 8bf1...
$ git cherry-pick d5c8...
$ git cherry-pick c2b9...
...<省略>...