はじめに
今年もアドベントカレンダーはじまりました!
この記事はHamee Advent Calendar 2018の1日目の記事です。
Hameeのエンジニア(一部デザイナー)が自分の興味あるテーマについて書いていきます。
毎年一緒に参加して盛り上げてくれる皆さんに感謝です
本題
さて本題ですが、常々思っていたんですがgitの差分を表示する時に「違う、そうじゃない」ってなることが多々あり、何とかしたいと思ったので調べました
サンプルコード
言語はなんでもいいんですがとりあえずPHP
にしておきます。
例えば以下のコードがあったとしましょう。
<?php
class Test{
public function hoge(){
return 'hoge';
}
public function moge(){
return 'moge';
}
}
この状態でコミット。
次に以下のように修正したとしましょう。
<?php
class Test{
public function test(){
return 'test';
}
public function hoge(){
return 'hoge';
}
}
- やったこと
- mogeメソッドの削除
- testメソッドの追加
これをgit diff
で見ると以下のようになります
class Test{
- public function hoge(){
- return 'hoge';
+ public function test(){
+ return 'test';
}
- public function moge(){
- return 'moge';
+ public function hoge(){
+ return 'hoge';
}
}
- この差分表示を見ると
- hogeメソッドをtestメソッドに変更
- mogeメソッドをhogeメソッドに変更
っていうように読み取れる
違う、そうじゃない
hogeメソッドは一切触っていないのにさも修正があったように見えて、開発者本人ならともかく第三者が見たら混乱するでしょう。
こんな時にぴったりのオプションがあります
git diff --histogram
or git diff --patience
このオプションを使って差分を表示すると以下のようになります
class Test{
+ public function test(){
+ return 'test';
+ }
+
public function hoge(){
return 'hoge';
}
-
- public function moge(){
- return 'moge';
- }
}
この差分であればtestメソッドを追加、mogeメソッドを削除、hogeメソッドに関しては差分なし、というのがはっきり分かります
まとめ
差分を検知するアルゴリズムを指定することでより人間に分かりやすい表示となります。
git diff --histogram
と git diff --patience
の違いは正直良く分かっていません(詳しい方補足お願いします)
アルゴリズムの詳しい挙動も良く分かっていないので場合によっては意図しない差分表示になるかもしれません。
この辺はもう少し勉強してみます。
惜しむべきは弊社でプルリクとかのやりとりに使っているbitbucket
では対応していないということでしょうか…
プルリクもdiffのアルゴリズムを指定できるようになると更に捗りそうだなーと思っています。
Atlassianさんご検討よろしくお願いしますw
参考
Git - git-diff Documentation
https://git-scm.com/docs/git-diff
おわりに
アドカレ4年目です。
Qiitaではゴミ記事問題などありましたが、知識をアウトプットしていくことはとても大事なことなのでこの文化だけはなくなってはいけないと思っています。
Qiitaでなくても良いし技術ブログでなくてもいい、とにかくアウトプットした方が絶対に成長できます。
皆さんも積極的にアウトプットしていきましょう!
ではこの後もHameeのアドカレをお楽しみに!