Git

歴史探究心旺盛な人へ、業務で使える便利git 2

gitに慣れ始めてきた人へ、業務で使える便利git10選 の続編

今回の事象

実際業務だと開発者が10人以上いて、毎週数件の案件がリリースされたりすると
masterにたくさんのmergeがされててログ探すのも一苦労。

うちではRedmine使ってて、チケット番号をブランチ名に入れるっていうルールで運用してるので
ブランチ名(チケット番号)からこの案件の「修正内容」が知りたかったりする
(refsも使ってるが今回はgitからログを探すということをテーマにやってみます)

1.まったく、このチケットでどんなソース入れたんだよ?!を知りたい

ブランチ名(あるいはブランチ名に含まれる文字)はわかる。
そのブランチ名でmergeされたcommitの内容を知りたい!という人へ

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

# まず、そのブランチ名が入った merge-commitを 洗い出す
# 最新のcommitが、masterにmergeしたcommit
$ git log --oneline --abbrev-commit --merges | grep [ブランチ名]
1111111111 Merge branch 'work_xxxxxxx'
2222222222 Merge branch 'master' into work_xxxxxxxx
4444444444 Merge branch 'master' into work_xxxxxxxx ## これはworkにmasterをmergeしたときのcommit

# masterへのmerge-commitが見つかれば、中にどのcommitをmergeしたかが書いてある
$ git show 1111111111
commit 11111111111111111111111111111111111111
Merge: 6666666666 2222222222
Author: test.taro <test.taro@test.co.jp>
Date:   Sat Jan 20 12:00:00 2018 +0900

    Merge branch 'work_xxxxxxx'

# commit一覧
$ git log --oneline 6666666666..2222222222
2222222222 Merge branch 'master' into yanagi_36370
3333333333 受注分類タグがテキスト編集中でも変更があれば確認アラートを表示するように修正
4444444444 Merge branch 'master' into yanagi_36370
5555555555 伝票画面を最新情報に更新する時に、変更内容の確認アラートを表示するように修正

ここまでできたらあとはやりたい放題
commit単体でshowしてもいいし、diff --statで変更ファイルをまるごと確認しても良い

2. え、このcommitでどのチケットで対応したの?!を知りたい

blameとかすると、誰がどのcommitでこの分岐を入れたのかとかはわかる。
でも、そのcommitコメントとかが適当だったりすると、どの案件で何を目的とした修正だったのかがわからない。

ということで、1とは逆に、commitからそれをmergeしたブランチ名を知りたい人へ

# 777777777をmegreしたcommtiがわかれば、showしてブランチ名取れる
$ git log 777777777..master --oneline --graph  --ancestry-path --merges
*   f2e3905c2f Merge branch 'work_yyyyy'
|\
| * c896ecd647 Merge branch 'master' into work_yyyyy
|/
* 8888888888 Merge branch 'work_xxxxx'
* 9999999999 Merge branch 'master' into work_xxxxx

masterのmergeログが全部出ちゃうので、古くなればなるほど見づらくはなるが、
最古のmegerログを見ればブランチ名はわかる
(上記のように開発途中でmasterをmergeしたログである可能性が高いが、そこからもブランチ名は取れるので)

シェルとか使うともうちょっと綺麗にできますが取り急ぎでよければこれで十分

参考

Find merge commit which include a specific commit

なんか他にもそれっぽいの見つけたら追記します