知に至る病

お勉強したことを忘れないように書き留めています。

git diff で行末に ^M が表示されるのは改行コードが CRLF になっているから

git diff で変更箇所の行末に ^M が表示される現象に遭遇しました。

f:id:amano41:20161101224054p:plain

原因

改行コードが CRLF になっていたのが原因でした。

git には空白文字の扱いを決める core.whitespace という設定があり,そこで blank-at-eol が有効になっていると,git diff した際に改行コードの前にある空白文字をエラーとして報告してくれます。 デフォルトでは CR は改行コードの一部ではなく空白文字として扱われるので,改行コードが CRLF になっていると CR の部分がエラーとなり,キャレット記法 ^M で反転表示されます。

解決方法

まず考えられるのは,改行コードをすべて LF にすることです。

改行コードを変更したくない・変更できない事情がある場合は,core.whitespacecr-at-eol を有効にして CR を改行コードの一部として認識させる方法もあるようです。

$ git config --global core.whitespace cr-at-eol
[core]
    whitespace = cr-at-eol

core.autocrlftrue で運用している場合も,この設定を併用するとよいのではないでしょうか。

参考資料