git cherry コマンドを活用しよう!
git cherry
コマンドをご存知だろうか?
git cherry-pick
は他のブランチ上の特定コミットを自分のブランチへ取り込むコマンドであるが、取り込んだものは別のコミットIDが与えられる。何度も cherry-pick を繰り返していると、取り込み済みのものと、まだ取り込んでいないものがわからなくなる。
それをチェックするのが git cherry
コマンドだ!
git log
でブランチ間のコミットを比較する
まずは、コミットログの差分をとってみよう。
下記コマンドにて カレントブランチHEAD
のコミットログのうち、ブランチorigin/debug-work
のログに含まれていない、3つのコミットが差分として出る。
$ git log --oneline origin/debug-work..HEAD
ed079ea (HEAD -> master, tag: rel-master, origin/master, origin/HEAD) Feat: use dfnas
3a4fe94 Feat: refine moveYYYY
0980bb3 Feat: install dfnas
だが、上記コミットのいくつかは cherry-pick で取り込んだものである。
git cherry
でブランチ間のコミットを比較する
git log
では cherry-pick で取り込んだものか否かがわからない。
そこで git cherry
の出番である。
$ git cherry -v origin/debug-work
- 0980bb30bd4d2e6a0e23bb992e6f5a01ad34abff Feat: install dfnas
- 3a4fe949a5b43af24cecde8b2a85d7d4fc230410 Feat: refine moveYYYY
+ ed079eaef5c768a0d3869f4d2e99060ec2e23c3e Feat: use dfnas
行頭に "-" が付いているものは cherry-pick で取り込み済みのコミットである。
行頭に "+" が付いているものは 取り込んでいないコミットである。
両者が共通に持つコミットは表示されない。
よって、行頭に "+" が付いているコミットのうち、必要なものを取り込んでいけば良い。
ブランチ管理への応用
git cherry
の出力が多くなったら、比較対象ブランチやカレントブランチを、両者の祖先ブランチへマージ・リベースすべき兆候と考える。
大量に積みあがったコミットを1つのプルリクエストとして処理するのは大変なので、区切りの良い箇所で分割して小さい単位で管理したほうが良い。その判断に利用できる。出力行数で判断できるので自動化も簡単である。
また、ブランチの分岐状況を調べたい場合に、ツールを使って分岐ツリーグラフを見るよりも、git cherry
でコミット比較を見た方が簡潔である。
git cherry
はマイナーだが、実はかなり使えるコマンドだと思う。
最後に一言
git cherry
はかなり使えるコマンドであるが、そもそもマージやブランチを先延ばしにするのは良くない。
git rebase
は、別コミットIDであってもコミット内容が同一であれば、リベース先のコミットIDを残してカレントブランチ側のコミットIDを捨てるので、衝突せずにうまい具合に処理してくれる。
よって、リベース先のコードが安定したら、さっさとリベースするほうが楽であることを覚えておいてほしい。