3
0

More than 1 year has passed since last update.

git cherry コマンドはブランチ間のコミット差分を知るのにとても便利だ

Last updated at Posted at 2023-03-03

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を捨てるので、衝突せずにうまい具合に処理してくれる。
よって、リベース先のコードが安定したら、さっさとリベースするほうが楽であることを覚えておいてほしい。

END

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0