Gitのcherry-pickは、特定のブランチ上のコミットを別のブランチに反映させたいときに便利な機能です。ここでは、cherry-pickの一般的な流れや注意点、さらにリポジトリ間のcherry-pickについても紹介します。
Cherry-Pickの例
まずは基本的な使い方から見ていきましょう。例えば、featureブランチの特定のコミットをmainブランチに反映させたい場合、以下の手順で行います。
1.反映先のブランチに移動します。
git checkout main
2.反映させたいコミットを指定してcherry-pickします。
git cherry-pick <コミットハッシュ>
実行後の挙動(コンフリクトなし)
- 通常のFFマージのように履歴が追記されます。
ただし、通常のマージと同じようにコンフリクトが発生することもあります。
$ git cherry-pick b457bfe
Auto-merging main.txt
CONFLICT (content): Merge conflict in test.txt
error: could not apply b457bfe... fix123
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".
hint: You can instead skip this commit with "git cherry-pick --skip".
hint: To abort and get back to the state before "git cherry-pick",
hint: run "git cherry-pick --abort".
hint: Disable this message with "git config advice.mergeConflict false"
- キャンセル(cherry-pick実行前に戻す)
→ git cherry-pick –abort - マージ後に続行
→ git add
→ git cherry-pick –continue
※mergetool利用時はgit addを省略できることあり。
git cherry-pick –continue実行後は、コミットメッセージの入力が促されます。
Cherry-Pickに関する補足事項
実施していることはパッチと似ています。
ところで、変更内容に依存関係がある場合はコンフリクトが発生します。
- Q変更の依存関係とは?
- A
同一ファイルを連続で変更(コミットB、C、D)したとします。このとき、コミットCはコミットBの変更の依存しています。
この場合、コミットCだけcherry-pickしようとするとコンフリクトが発生します。さらに、コンフリクトファイルにはコミットBの内容を含むため、マージの際は注意が必要です。
ただし、コミットBとコミットCを同時にcherry-pickする場合は、コンフリクトは発生しません。
リポジトリ間のcherry-pick
以前に、リポジトリ間のマージを紹介したことがありますが、同じような操作で可能です。
全体的な流れは、
- マージ元リポジトリのURLを追加登録する。
- マージ元リポジトリの内容をfetchする。
- マージ元リポジトリの任意ハッシュをCherry-pickする。
です。
コマンド例は次の通りです。
# マージ先に移動しておく
git checkout <マージ先のブランチ>
# マージ元のリモートリポジトリをupstreamという名前で追加登録
git remote add upstream <リモートリポジトリURL>
# upstream内容を取得
git fetch upstream
# cherry-pick実行
git cherry-pick <リモートのコミットハッシュ>
最後に
Gitのcherry-pickは、特定のコミットを別のブランチに反映させたいときに便利なテクニックです。
- ただし、依存関係やコンフリクトの対処に注意が必要です。
- さらに、リポジトリ間でのcherry-pickも可能です。
※cherry-pickを前提とする運用ではなく、ここぞってときに使えるように覚えておきたいですね!
最後までお付き合いいただき、ありがとうございました!
コメント