Git

Gitで何回もコミットとマージをしたブランチをコミットだけをチェリーピックしてブランチ造り直す方法

More than 1 year has passed since last update.

こんなことをすることになった経緯
1. branchBをベースにつくったbranchAがあります。
2. branchAでは何回もCommit(& Push)をしました。
3. branchBの変更を取り込むためにbranchBをbranchAへ何度かMargeをしました。
4. とある日・・・branchDをベースにしなければならないことが発覚しました:scream:
5. branchDをベースにしてbranchCを造ることになりました:cold_sweat:

  • branchA : 何回もコミットとbranchBをマージをしたブランチ
  • branchB : branchAのベースになったブランチ
  • branchC : buranchAのコミットだけをチェリーピックしたいブランチ
  • branchD : branchCのベースにしたいブランチ

1. branchAをCheckoutする

$ git checkout branchA

2. コミットのハッシュとコメントをCSVに出力する

  1. コミットのハッシュとコメントを確認する
  2. ブランチが開始されたCommitを特定する
  3. 特定したコミットの日付を確認する
  4. 特定したコミットの日付以降のハッシュとコメントを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用コマンドを造る

  1. CSVをExcelで開く
  2. コメントが「Merge branch~」になっている行(Marge)を削除する
  3. 列を左に挿入して降順で番号をつける
  4. 古いCommit順に並べるために、挿入した番号の昇順でソートする
  5. 連番とコメントを削除してハッシュのみ残す
  6. ハッシュの隣の列に「="git cherry-pick "&{ハッシュのセル}」を入れて一気にコマンドを造る

4. branchCを造る

  1. branchDをチェックアウトする
  2. branchCを造る
$ git checkout branchD
$ git checkout -b branchC

5. branchCにbranchAのCommitだけcherry-pickする

  1. 3. で造ったcherry-pickコマンドを次々に実行する
  2. 途中でコンフリクトしたら解決して再度実行していく
$ git cherry-pick 1201...
$ git cherry-pick 8bf1...
$ git cherry-pick d5c8...
$ git cherry-pick c2b9...
...<省略>...