改行コードを統一:Git の差分に出る ^M の正体
Windows や古い Mac から受け取ったテキストは CRLF や CR の改行を含み、Git の差分や Linux のスクリプト、オンラインエディタで ^M や余分な空行として現れます。LF に統一しても画面では分かりませんが、差分はきれいになります。
改行コードを統一したい場面
同じコードを Windows で編集し Linux で動かすと、Git の差分がファイル全体の変更として表示されることがあります。実際の違いは各行末の CRLF と LF だけで、チームに Windows と macOS が混在していると、このノイズが毎日現れて本当の変更が見えなくなります。
スクリプトが動かない場合も同じです。Web ページやチャットからコピーしたシェルスクリプトは行末に CR が付き、インタプリタがエラーを出したり、コマンドに不可視の文字が混ざったりします。LF に統一すればたいてい即座に直り、設定ファイルや CSV、字幕でも同じ問題が起きます。
- Git の差分が全ファイル変更になり ^M が付く
- Windows からコピーしたシェルスクリプトが動かない
- アップロード前の CSV・設定・字幕の形式統一
驚かないための使い方
CRLF(Windows。CR の後に LF)と単独の CR(古い Mac)が LF に置き換わり、他の文字は一切変わりません。テキスト欄では3種類とも改行として表示されるため、置換後も見た目は元とまったく同じに見えます。
本当に変わったかを確かめるには、不可視文字を表示できるエディタに貼って行末を見るか、コミットして差分に ^M が残っていないかを見ます。置き換わるのは改行だけなので、空行や行末の空白、インデントはそのまま残り、必要なら別途整える工程が要ります。
- 見た目は同じなので不可視文字か Git で確認する
- 改行のみ置換で空行やインデントは変わらない
- 必要なら行末空白の削除を続けて行う
使えない場面と代替手段
ファイルの文字コード(UTF-8、GBK、UTF-16)は変えず、BOM にも触れません。文字コード自体が違っていれば、改行を揃えても文字化けは残ります。それは別の問題で、文字コード変換のツールが必要です。
リポジトリ全体に対して1ファイルずつ貼り付けるのは現実的ではありません。その場合は .gitattributes に text=auto を設定するか、dos2unix やエディタの一括変換を使います。Web ツールは1ファイルや1つのテキスト向けで、恒久的な運用には向きません。
- 文字コードは変えず BOM も除去しない
- リポジトリ全体は .gitattributes か dos2unix で
- Web ツールは単発の1ファイル向け
よくある質問
結果が元の文章とまったく同じに見えるのですが、本当に変わっていますか?
変わっています。テキスト欄ではどちらの改行も改行として表示されるため、見た目では区別できません。不可視文字を表示できるエディタに貼るか、Git の差分に ^M が残っていないかで確認してください。
余分な空行や行末の空白も削除されますか?
削除されません。置き換えるのは改行コードだけで、空行や行末の空白、インデントはそのまま残ります。あわせて整えたい場合は、行頭・行末の空白削除や空行削除のツールを組み合わせてください。
CRLF と LF は具体的に何が違うのですか?
CRLF は CR(復帰)と LF(改行)の2文字で、Windows のメモ帳でよく使われます。LF は改行1文字で、Linux や macOS で使われます。エディタでは同じに見えてもバイト列が違い、Git やスクリプトがここでつまずきます。
関連ツール:改行コードを統一