マージコミットを含む大きめのgitブランチをcherry-pickで別ブランチに持っていくには
はじめに
マージコミットを含む大きめのgitブランチを,別のブランチに持って行きたい状況が発生したのでメモ*1.
取り込みたいブランチを1コミットにまとめ,これを取り込み先ブランチにcherry-pickマージする方法を記す*2.
なお,複数コミットを1コミットにまとめる方法について,一般にはgit rebaseでsquashやfixupを用いることが多い*3が,マージコミットに対してはうまくいかなかった*4.
そこで,ここでは取り込みたいブランチについて差分パッチを作成し適用するという方法をとった.
やりかた
# Xを1コミットにまとめるための一時的なブランチ(B_dummy)を作成 git checkout A1 git checkout -b B_dummy # B1〜B3をパッチ化(参考[3]) git diff --binary A1..B3 > X.patch # パッチをB_dummyにあて(参考[4]),B1〜B3を1コミット(=X)にまとめる git apply X.patch git add [target files] git rm [target files] git commit -m 'this is X: patch A1..B3' # 別ブランチA'1に移動し,トピックブランチB'を作成し,Xをcherry-pickで持ってくる git checkout A'1 git checkout -b B' git cherry-pick X
参考
- [1] git rebase -i はやっぱりイケてる件【git】【rebase 】【iオプション】 - DRYな備忘録 - http://otiai10.hatenablog.com/entry/2012/11/10/013925
- [2] git rebase interactive: squash merge commits together - Stack Overflow - http://stackoverflow.com/questions/1725708/git-rebase-interactive-squash-merge-commits-together
- [3] gitで差分を抽出してpatchで使えるファイルを生成 | 秋山ブログ - http://d.akiroom.com/2013-10/git-diff-extract-patch/
- [4] Git - プロジェクトの運営 - https://git-scm.com/book/ja/v1/Git-%E3%81%A7%E3%81%AE%E5%88%86%E6%95%A3%E4%BD%9C%E6%A5%AD-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E9%81%8B%E5%96%B6#%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%A7%E5%8F%97%E3%81%91%E5%8F%96%E3%81%A3%E3%81%9F%E3%83%91%E3%83%83%E3%83%81%E3%81%AE%E9%81%A9%E7%94%A8