git cherry-pickの使い方:特定のコミットをブランチに適用する方法

スポンサーリンク

この記事では、Gitのcherry-pickコマンドを使って、特定のコミットを現在のブランチに適用する方法を詳しく解説します。cherry-pickは、別のブランチで行われた修正を簡単に取り込むことができる便利なツールです。競合が発生した場合の対処方法や、適用前に作業ディレクトリをクリーンにするための手順も含めて説明します。

スポンサーリンク

現在のブランチに特定のコミットのパッチを適用 (git cherry-pick)

特定のコミットを指定して適用

git cherry-pickは別のブランチで行われたバグ修正等を現在のブランチに反映させたい場合に便利です。

以下のコミット履歴を想定します。

git cherry-pickで特定のコミット(複数可)を指定すると現在のブランチにそのコミットを適用させることができます。
競合が発生したら、その競合を解決するための処理に移ります。

git cherry-pickを解決したら現在のブランチ(masterブランチ)に指定したコミットを適用できます。コミット履歴は以下のようになります。

古いコミットのコミットメッセージの変更

ここでは、とても単純な形のコミット履歴でブランチが分岐しているような古いコミットのコミットメッセージを変更するような想定でgit cherry-pickを利用したいと思います。
まず、以下のようなコミット履歴を想定します。

2番目のブランチが分岐するコミットのメッセージを変更したいと思います。コマンドのみを示すと以下のような流れとなります。

その後にコミット履歴を確認すると2番目のコミットがコミットメッセージが異なりますが2つあるような感じになります。

修正したコミットに対して、チェックアウトを行い、ブランチの作成と作成したブランチへのチェックアウトを行います。

コミット履歴は以下のようになります。

次にgit cherry-pickでb1ブランチのコミットを適用させていきます。基本的に適用されるコミットの内容で競合を起こさないはずですが、作業ディレクトリに何かゴミ(適用するコミットで作成するはずの同名のファイル等)があると競合するので、cherry-pickを行う前に一度、git statusで作業ディレクトリを確認後に、作業ディレクトリの内容をgit clean等できれいにしてからcherry-pickを適用しても良いかもしれません。
また、git cherry-pickのコミットの範囲の指定はもっといい指定方法があるかもしれませんがここではコミットIDを用いて直接範囲を指定しています。

コミットの範囲はダブルドットで指定した左のコミットは適用するコミットに含まれないことに注意が必要です(数学的に表すとa<x<=b, もしくは(a,b]みたいなイメージの指定といえるかもしれません)。

コミットの範囲は直前を表す(^)を用いて、適用するコミットのみを用いた

みたいな記述をしても良いでしょう

この例でgit cherry-pickが適切に適用されると

のようになり、きれいに処理が完了します。これで、コミット履歴を確認すると

のようになり、ブランチの削除とリネームを行うと

コミット済みの古いコミットメッセージを変更した形になったコミット履歴を作成できます。