Git Cherry-pick
最終更新
git cherry-pick は、1 つ以上の特定のコミットの変更をコピーし、それらを新しいコミットとして現在のブランチに適用します。ブランチ全体をマージせずに別のブランチから 1 つの修正だけを取り込む方法です。ホットフィックスをバックポートしたり、フィーチャーブランチから 1 つのコミットを取り出したりするのに便利です。
これらをターミナルプレイグラウンドで試してみましょう。ブラウザ上の本物のシェルで、インストールするものは何もありません。
構文
| Command | What it does |
|---|---|
git cherry-pick <hash> | 現在のブランチに 1 つのコミットを適用する |
git cherry-pick <a> <b> | 複数のコミットを順番に適用する |
git cherry-pick <a>..<b> | コミットの範囲を適用する(a を除く) |
git cherry-pick -n <hash> | 変更を適用するがまだコミットしない |
git cherry-pick -x <hash> | 元のコミットをメッセージに記録する |
cherry-pick の実行中
cherry-pick で競合が発生した場合は、解決してから続行します。
| Command | What it does |
|---|---|
git cherry-pick --continue | 競合を解決した後に再開する |
git cherry-pick --abort | キャンセルしてブランチを復元する |
git cherry-pick --skip | 現在のコミットをスキップする |
実例
| 手順 | コマンド | 結果 |
|---|---|---|
| 1 | git log --oneline hotfix | 修正コミットのハッシュを探す(例:a1b2c3d) |
| 2 | git switch main | 修正を取り込むブランチに移動する |
| 3 | git cherry-pick a1b2c3d | 修正を、新しいハッシュを持つ新しいコミットとして main に適用する |
Git cherry-pick に関するよくある質問
git cherry-pick は何をしますか?
特定のコミットが導入した変更を取り出し、それらを(新しい hash を持つ)まったく新しいコミットとして現在のブランチに適用します。merge や rebase とは異なり、ブランチ全体を取り込むことはなく、指定したコミットだけを取り込みます。
cherry-pick はいつ使うべきですか?
特定のコミットを別の場所で必要とするときに使います。たとえば、バグ修正を
main から release ブランチにバックポートしたり、すべてをマージせずにフィーチャーブランチから 1 つの有用なコミットを取り出したりする場合です。ブランチ全体が必要な場合は、代わりに merge や rebase を使いましょう。複数のコミットを cherry-pick するにはどうすればよいですか?
それらを列挙します。
git cherry-pick <a> <b> <c> は各コミットを順番に適用します。連続した範囲には git cherry-pick <start>..<end> を使います。これは start より後のすべてのコミットを end を含めて適用します。start 自体も含めたい場合は <start>^..<end> を追加します。cherry-pick で競合が発生したらどうすればよいですか?
Git は一時停止し、競合したファイルにマークを付けます。それらを解決し、結果を
git add してから git cherry-pick --continue を実行します。完全に取りやめるには git cherry-pick --abort を使います。これはブランチを cherry-pick が始まる前の状態に復元します。別のブランチからコミットを cherry-pick するにはどうすればよいですか?
git log --oneline <other-branch> でコミットのハッシュを調べ、取り込む側のブランチに切り替えて git cherry-pick <hash> を実行します。git cherry-pick feature のようにブランチ名を渡すこともでき、その場合はそのブランチの先頭にあるコミットが取り込まれます。cherry-pick と merge の違いは何ですか?
git merge はブランチ上のすべてのコミットを取り込み、履歴が合流した地点を記録します。cherry-pick は指定したコミットだけを新しいコミットとしてコピーし、元のコミットとのつながりは残りません。ブランチ全体が欲しいときは merge、1つか2つのコミットだけが欲しいときは cherry-pick を使います。
これをオンラインで練習できますか?
はい。ターミナルプレイグラウンドを開けば、ブラウザ上の本物のシェルで
git cherry-pick を実行できます。インストールするものは何もありません。Coddy の無料のインタラクティブな Git コースでも、ブランチ間でコミットを移動する方法を段階的に扱っています。