Git の別ブランチのコミットを取り込むには : git cherry-pick

Git のちょっと発展的な使い方の話。

develop ブランチから派生した feat/hoge ブランチにて作業をしていたが、途中で feat/piyo ブランチを作り直したくなった。

単にブランチ名を変更するだけで良ければ、git branch -m を使って、

$ git branch -m feat/hoge feat/piyo

# feat/hoge ブランチをチェックアウトしている状態なら新しいブランチ名のみ指定すれば OK
$ git branch -m feat/piyo

という風に叩けばリネームできる。

しかし、今回は feat/hoge ブランチでの変更内容の間に、feat/piyo 独自の変更を混ぜ込みたかった。

そこで活用したのが、git cherry-pick というコマンド。$ git cherry-pick 【コミット ID】 と指定すると、そのコミットを反映できる。

以下の手順で利用した。

# 予め feat/hoge のコミット ID を確認しておく。以下の3つのコミットは全て feat/hoge でのコミットとする
$ git log -3 --date=short --pretty=format:"[%h] %cd %s"
[ad20b14] 2018-05-14 feat/hogeにて◯◯を修正
[7201f30] 2018-05-13 feat/hogeにて□□を追加
[ac6f25a] 2018-05-12 feat/hogeを新規作成・〇〇を追加

# develop ブランチから feat/piyo ブランチを新規作成する
$ git checkout -b feat/piyo

# 5月12日の一番古いコミットを feat/piyo ブランチに取り込む
$ git cherry-pick ac6f25a
# 再度変更を入れ、コミットを修正したりする
$ git commit --amend

# 何か修正して、独自にコミットを打ったり…
$ git commit -m "feat/piyoにて新たに△△を追加"

# 再び feat/hoge ブランチの変更 (2つ目のコミット) を取り込む
$ git cherry-pick 7201f30

# 3つ目のコミットも取り込む
$ git cherry-pick ad20b14

…と、こんな感じ。

複数のコミットをまとめて取り込むこともできるが、コンフリクトが起こりやすいので一つずつ検証していった方が安全かと思う。

しかしこんな手法があるなんて知らなかった…