Git
diff

Gitで日本語長文のdiffをとる方法

(この記事はここからの転載です)

課題

日本語の長文をgitで管理していると、ほんのちょっとの変更でもdiffでは行丸ごと変更されたことになり、変更点がよくわからないことがある。

二泊三日で小説を書く過激なイベントNovelJam 2018参加作品である高橋文樹氏の「オートマティック クリミナル」は、GitHubを使って執筆されている。小説では、git diffの欠点がはっきりでる。高橋氏は参加レポートで、こう書いている。

あと、今回得た重要な知見なのですが、Githubではある程度以上テキストが長くなってくると、数文字の調整で全部差分として判定されたりするので、小説には向いてないかなーと思いました。小説は行の移動とかがよく発生するので、GithubじゃなくてGitとの相性かもしれません。

普通にdiffを取る

確かに、普通にdiffをとるとその通り。コマンドラインで「オートマティック クリミナル」リポジトリの途中経過diffを

git diff 8ae5f..d0394

上記でとった結果は、以下の通りになる。

normal-git-diff-japanese.png

文字単位でdiffをとる

同じ変更を、--word-diff-regexを適切に指定してgit diffしてみる。

git diff --word-diff-regex=$'[^\x80-\xbf][\x80-\xbf]*' --word-diff=color 8ae5f..d0394

すると、このような結果が得られる。文字単位で変更点が把握できるのだ。

word-git-diff-japanese.png

なお、git diff --word-diff-regex=.でも良さそうなものだが、これだと(少なくとも私の環境では)diff部分が文字化けしてしまう。unicodeの文字単位ではなく、byte単位でdiffが取られてしまっているようだ。

GitHubでは--word-diff-regex相当の設定はできなさそうで残念。