皆様はGitLabのアイコンの動物はキツネではなくタヌキだということをご存じでしょうか?
そんな話はさておき、Gitのcherry-pickについて紹介します。 主にGit BashでのCLI操作での紹介となります。
前提知識
Gitでのハッシュ値とは
SHA-1 【Secure Hash Algorithm 1】のハッシュ関数を用いて作成される一意の値のことです。
この値は16進数で40桁の値で表示されますが、ハッシュ値からコミットを特定する際は、小さなプロジェクトでは最小4桁でも該当コミットのハッシュ値を推定可能です。
セキュリティーリスクがより低いSHA-256へ移行しているGitのプロジェクトもありますが、主流はSHA-1となっています。
チェリーピックの由来
熟したサクランボだけを選んで摘み取ることから来ており、転じて「良いところだけを選ぶ」という 意味で使われます。
Gitでは欲しいコミット差分を現在のブランチに取り込むことができる操作のことを指します。
具体的にどんな操作なのか
他のブランチの特定のコミットの差分を現在のブランチの先頭に新しいコミットとして追加します。
そのため、他ブランチの任意コミットのハッシュ値とチェリーピックしたコミットのハッシュ値は異なります。
下の図はfeatureブランチのコミットをmainブランチにチェリーピックした際のイメージです。
featureブランチのコミット(b644e4d8)をチェリーピックし、新しくコミット(c7d8e9f0) が出来たことを表しています。
Git Bashでの使い方
git cherry-pick <欲しいコミットのハッシュ値>
チェリーピックと似た操作の紹介
① マージ
コミット単位ではなくブランチの差分を取り込む操作です。
同じハッシュ値のコミットがマージされます。
- マージコミットは別のハッシュ値で生成されます。
② patchファイルを作成して適用
作業ディレクトリの差分を取り込む操作です。
ファイルとして受け渡し可能で、差分のステージングとコミットが必要です。
チェリーピックの応用
- 複数コミットをまとめてチェリーピック
半角スペース区切りで指定
git cherry-pick <ハッシュ値1> <ハッシュ値2>
- 始点終点を指定 意図しない競合発生が起きる可能性があるため、マージコミットを含むコミットのチェリーピックは注意が必要です。
git cherry-pick <始めのハッシュ値>^..<終わりのハッシュ値>
- オプション指定
コミットメッセージを任意に編集
git cherry-pick <ハッシュ値> --edit
差分をステージングした状態にする(コミットは作成されません)
git cherry-pick <ハッシュ値> --no-commit