Git Cherry-pick – あるコミットだけ「取る」方法

フィーさんのGitシリーズの記事の続きとして、今日はGit cherry-pickについてシェアしたいと思います。 

はじめに 

Gitで、「feature」ブランチに大切なコミットがあり「main」ブランチにもそのコミットが必要となったケースを想定します。 
でもブランチ全体をマージしたくないです。コミット1つだけがほしいです。 

このとき、git cherry-pick を使います。 

Git Cherry-pickとは? 

git cherry-pick は、あるブランチから 1つのコミットをコピーして、別のブランチに入れるコマンド です。 

  • mergerebase は、ブランチの履歴を全部持ってきます。 
  • cherry-pick は、コミットを1つだけ持ってきます。 

簡単に言うと、「cherry-pick = 木から好きなさくらんぼを1つ取る」です。 

基本の使い方 

git checkout <target-branch> 

git cherry-pick <commit-hash> 

  • target-branch = コミットを入れたいブランチ 
  • commit-hash = ほしいコミットの番号 

コミット番号を見るときは: 

git log –oneline 

 

  1. feature/target_feature ブランチにバグ修正のコミット「a1b2c3d」があります。 
  1. それを main ブランチに入れたいです。 

やり方: 

git checkout main 

git cherry-pick a1b2c3d 

よく使うオプション 

-x オプション 

  • 元のコミット番号をメッセージに書きます。 
  • どこから来たコミットか、すぐにわかります。 

git cherry-pick -x <commit-hash> 

-s オプション (signoff) 

  • コミットメッセージに「Signed-off-by」を入れます。 
  • だれがこのコミットを確認したか、わかります。 

git cherry-pick -s <commit-hash> 

--continue 

  • Cherry-pick中に**コンフリクト(衝突)**があったときに使います。 
  • 衝突を直して、git add . をしたあとに: 

git cherry-pick –continue 

--quit 

  • Cherry-pickをやめたいときに使います。 
  • 今のcherry-pickを終了しますが、作業ファイルはそのままです。 

git cherry-pick –quit 

注意点 

  1. コンフリクト(衝突) 
    マージと同じように、cherry-pickでも衝突が起こることがあります。 
    そのときは直して、git add . して、git cherry-pick --continue をします。 
  1. 使いすぎないこと 
    Cherry-pickをたくさん使うと、Gitの歴史がわかりにくくなります。 
  1. mergeとのちがい 
  • merge = 歴史ごと持ってくる。 
  • cherry-pick = コミットだけ持ってくる。 

まとめ 

git cherry-pick は便利です。コミット1つだけ必要なときに使えます。 
でも、使いすぎると大変になります: 

  • コミットがふえます:同じ内容のコミットが、いくつもできます。番号(ハッシュ)がちがうので、まぎらわしいです。  
  • ログがよみにくいです:git log で同じようなコミットが出てきて、どれが本当かわかりにくいです。  
  • コンフリクトがふえます:何回もcherry-pickすると、マージのときに同じ所でコンフリクトになることがあります。 

だから、cherry-pickはとくべつなときだけ使うほうがいいです。 

今日の記事では、Git cherry-pickについて勉強しました。つぎの記事では、Git rebaseをしょうかいします。 

ぜひ楽しみにしてくださいね! 

参考資料: 

https://git-scm.com/docs/git-cherry-pick