Git 特定のコミットを取り込む(cherry-pick) と コミットをまとめてマージ(merge --squash)
特定のコミットだけを取り込みたい!(cherry-pick)
git cherry-pick は特定のコミットのみを取り込みたいときに使用します。
上の図で自分がブランチ2(作業ブランチ)で複数コミットをして、そのうちのコミットA,Bのみを親ブランチであるブランチ1に含ませたいとき、git cherry-pickが有効です。
差分を取り込みたいブランチ(図の場合ブランチ1)に移動し、取り込みたいコミット番号を指定してcherry-pickをします。(オレンジはコミット番号です)
git checkout ブランチ1
git cherry-pick abcd0001 abcd0002
これだけで指定したコミットを取り込むことができます。また、このときログを見ると新たなコミット番号が追加されています。取り込んだ後にコミットまでされるので、一旦差分のみ取り込みたいときは-n
オプションをつけることで解決できます。
git cherry-pick -n abcd0001 abcd0002
また、連続したコミットを取り込みたいときは...
git checkout ブランチ1
git cherry-pick abcd0001..abcd0004
とすると連続したコミットを取り込むことができます。
コミットをまとめたい!(merge --squash)
普通のマージとスカッシュマージの違いについて
下図のような状態があったとします。
ブランチ2で作業をして、ブランチ1にマージするとき
git checkout ブランチ1
git merge ブランチ2
をしたとき、当たり前ですが、ブランチ1にブランチ2の差分がマージされます。このとき、B,C,Dのコミットはそのままマージされるので、ブランチ1でgit log を確認すると3つのコミットのログが確認できると思います。
これでも問題ないのですが、例えば、ちょっとした修正がありコミットが多くなると、細かいコミットが何個も生成され、ログも増え、確認したいときに困惑することがあるかもしれません。
そこで、複数コミットを1つにまとめる、squash mergeを使います。使い方は先ほどのmergeコマンドにオプションを指定するだけです。
git checkout ブランチ1
git merge --squash ブランチ2
ログはすっきりしますが、変更箇所が分かりにくくなるというデメリットもあるので、故意にコミットを細かく分けているときは気をつけた方がいいかもしれません。
Discussion