git cherry-pick の基本概念
git cherry-pick <commit-hash> は、特定のコミットのみを抽出して、現在の作業ブランチに適用するためのコマンドです。通常、ブランチ全体を統合する git merge とは異なり、必要な変更だけを「つまみ食い」するように選択できるのが特徴です。
ここで指定する Commit Hash(コミットハッシュ) とは、Git における各コミット固有の識別子です。これはハッシュアルゴリズムによって生成され、投稿者、日時、変更内容などの情報が含まれています。このハッシュを指定することで、特定の履歴をピンポイントで操作可能になります。
merge と cherry-pick の違い
- git merge <branch>: 指定したブランチのすべての変更履歴を現在のブランチに統合します。
- git cherry-pick <commit-hash>: 指定した特定のコミット内容のみを現在のブランチに適用し、新しいコミットとして生成します。
フォーク元(Upstream)の変更を同期する実戦的な手順
GitHub などでリポジトリをフォークした際、元のリポジトリ(上流リポジトリ)の特定の修正だけを取り込みたい場合に cherry-pick は非常に有効です。以下にそのワークフローを示します。
1. 上流リポジトリのリモート登録
まず、フォーク元のリポジトリを upstream-repo という名前でローカル環境に紐付けます。
# 上流リポジトリを登録
git remote add upstream-repo https://github.com/original-owner/project.git
# 登録情報の確認
git remote -v
2. 最新情報の取得
上流リポジトリの最新のコミット履歴を取得します。ここでは pull ではなく fetch を使うことで、現在の作業内容を汚さずに履歴だけを確認できます。
# 上流リポジトリのデータを取得
git fetch upstream-repo
3. 対象コミットの特定
取り込みたいコミットのハッシュを確認します。git log コマンドにオプションを付けることで、効率的に探索できます。
# 上流リポジトリの特定のブランチの履歴を表示
git log upstream-repo/main --oneline -n 10
--oneline オプションを使用すると、ハッシュの短縮版とコミットメッセージが一行で表示され、目的のコミットを見つけやすくなります。
4. コミットの適用
反映させたいブランチ(例: feature-branch)に切り替えた状態で、cherry-pick を実行します。
# 作業ブランチへ移動
git checkout feature-branch
# 特定のコミットを適用
git cherry-pick a1b2c3d
コンフリクトへの対応
cherry-pick を実行した際、現在のコードと適用しようとしている変更が競合し、コンフリクトが発生することがあります。その場合は以下の手順で対応します。
- 競合ファイルをエディタで開き、修正を行う。
git add <file>で修正をステージングする。git cherry-pick --continueを実行して処理を完了させる。
もし途中で cherry-pick を中断し、実行前の状態に戻したい場合は git cherry-pick --abort を使用します。