「何も変更してないのに、ファイル全体が差分として表示される…」
こんな経験はありませんか?これ、実は改行コードが原因なんです。
WindowsとMac/Linuxでは改行の方法が違うため、チーム開発で思わぬトラブルが起きることがあります。この記事では、Gitで改行コードを適切に扱う方法を分かりやすく解説していきます。
改行コードって何?なぜ問題になるの?

改行コードとは、コンピューターが「ここで改行する」と認識するための特殊な文字のことです。
実は、この改行を表現する方法が、OSによって異なるんですね。
改行コードの種類
- LF(Line Feed):Mac・Linuxで使用
- CRLF(Carriage Return + Line Feed):Windowsで使用
もともと、この違いはタイプライターの時代にさかのぼります。タイプライターでは「キャリッジを左端に戻す(CR)」と「次の行に移動する(LF)」が別々の操作だったため、Windowsではその両方を使うようになったんです。
問題が起こる具体例
Windowsで作業している人がCRLFでファイルを保存すると、Macで作業している人がそのファイルを開いたときに改行コードがLFに変わります。
すると、1行も変更していないのに「全ての行が変更された」とGitが判断してしまうんですね。
これでは、本当の変更箇所が分からなくなってしまいます。
Gitの改行コード自動変換機能(core.autocrlf)
Gitには、この問題を解決するための自動変換機能が用意されています。それがcore.autocrlfという設定です。
この設定は、ファイルをコミットするとき・チェックアウトするときに、自動的に改行コードを変換してくれます。
設定値とその意味
core.autocrlfには3つの設定値があります。
true(Windowsでの推奨設定)
- コミット時:
CRLF→LFに変換 - チェックアウト時:
LF→CRLFに変換
リポジトリ内は常にLFで統一され、ローカル環境ではCRLFで作業できます。
input(Mac・Linuxでの推奨設定)
- コミット時:
CRLF→LFに変換 - チェックアウト時:変換しない
リポジトリ内をLFで統一しつつ、ローカルもそのままLFで扱います。
false(変換しない)
- コミット時:変換しない
- チェックアウト時:変換しない
改行コードをそのまま扱います。チーム全体で改行コード管理を徹底する必要があります。
改行コードの設定を変更する方法
実際に設定を変更してみましょう。コマンドはとてもシンプルです。
グローバル設定(全てのリポジトリに適用)
すべてのGitリポジトリに対して設定する場合は、--globalオプションを使います。
git config --global core.autocrlf false
Windows環境で作業する場合は、このようにします。
git config --global core.autocrlf true
Mac・Linux環境なら、こちらですね。
git config --global core.autocrlf input
ローカル設定(特定のリポジトリのみに適用)
特定のプロジェクトだけ設定を変えたい場合は、リポジトリのディレクトリで--localを使います。
git config --local core.autocrlf false
または--localを省略しても、デフォルトでローカル設定になります。
git config core.autocrlf false
現在の設定を確認する方法
今どんな設定になっているか確認したいときは、こうします。
git config --show-origin core.autocrlf
このコマンドは、設定ファイルの場所と現在の設定値を表示してくれます。
実行結果の例がこちらです。
file:C:/Users/YourName/.gitconfig true
または、すべての設定を一覧表示することもできます。
git config --global --list
.gitattributesを使った推奨設定方法
core.autocrlfの設定は各開発者のローカル環境に依存するため、チーム全体で統一するのが難しいという問題があります。
そこで推奨されるのが、.gitattributesファイルを使った方法です。
.gitattributesとは
.gitattributesは、リポジトリのルートディレクトリに置く設定ファイルで、改行コードの扱い方をプロジェクト全体で統一できます。
この設定はリポジトリに含まれるため、全員が同じ設定を共有できるんですね。
基本的な.gitattributesの作成方法
リポジトリのルートに.gitattributesファイルを作成し、以下のように記述します。
# すべてのテキストファイルをLFに統一
* text=auto
このtext=autoという設定は、Gitがテキストファイルと判断したファイルの改行コードを自動的にLFに変換します。
画像やフォントなどのバイナリファイルは対象外なので安心してください。
より詳細な設定例
ファイルタイプごとに細かく設定することもできます。
# デフォルトの動作
* text=auto
# 明示的にテキストファイルとして扱い、LFで統一
*.txt text eol=lf
*.js text eol=lf
*.css text eol=lf
*.html text eol=lf
*.py text eol=lf
# Windowsバッチファイルは必ずCRLFが必要
*.bat text eol=crlf
*.cmd text eol=crlf
# バイナリファイルは変換しない
*.png binary
*.jpg binary
*.gif binary
*.pdf binary
バッチファイル(.batや.cmd)は、Windowsで実行する際にCRLFが必須なので、明示的にeol=crlfを指定しています。
.gitattributesを追加した後の処理
.gitattributesファイルを作成・コミットした後、既存のファイルに設定を反映させる必要があります。
こうすることで、リポジトリ内のすべてのファイルの改行コードが正規化されます。
# 作業ツリーのファイルを一時的に削除
git rm --cached -r .
# すべてのファイルを再度追加(改行コードが正規化される)
git add .
# 正規化をコミット
git commit -m "改行コードをLFに統一"
注意点として、この操作を行うと多くのファイルが「変更された」として表示されます。でも、実際には改行コードが変わっただけなので心配いりません。
差分表示で改行コードを無視する方法
すでに改行コードが混在している状況で、「本当の変更箇所だけを確認したい」という場合もありますよね。
そんなときは、差分表示で改行コードの違いを無視できます。
git diffで行末の空白を無視する
git diff --ignore-space-at-eol
このコマンドは、行末の空白や改行コードの違いを無視して差分を表示します。
長いので、エイリアス(短縮コマンド)を作っておくと便利ですよ。
git config --global alias.diffi "diff --ignore-space-at-eol"
これで、git diffiと入力するだけで改行コードを無視した差分が見られます。
git statusで^Mを表示させない方法
差分を見たときに、行末に^Mという記号が表示されることがあります。これはCRLFの改行コードを表しています。
この表示を消すには、以下の設定をします。
git config --global core.whitespace cr-at-eol
これで、差分表示で^Mが出なくなります。
リポジトリ内の改行コードを確認する方法

実際にリポジトリ内にどんな改行コードのファイルがあるか確認したい場合は、こうします。
CRLFを含むファイルを探す
git grep --cached -I $'\r'
このコマンドは、リポジトリにコミットされているファイルの中から、CRLF(\rつまりCarriage Return)を含むファイルを検索します。
-Iオプションは、バイナリファイルを除外するためのものですね。
ファイルごとの改行コード状態を確認する
Git 2.10以降では、より詳細な情報が得られます。
git ls-files --eol
このコマンドの出力例がこちらです。
i/lf w/lf attr/text=auto index.html
i/crlf w/crlf attr/text=auto script.js
i/lf w/lf attr/ style.css
表示の意味は以下のとおりです。
i/lf:インデックス(リポジトリ)内の改行コードがLFw/crlf:作業ディレクトリ内の改行コードがCRLFattr/text=auto:.gitattributesでの設定
よくあるトラブルと対処法
改行コード関連でよく遭遇する問題と、その解決方法を紹介します。
トラブル1:「LF will be replaced by CRLF」という警告が出る
Windowsでcore.autocrlf=trueに設定している場合、この警告が表示されることがあります。
これは「次回チェックアウト時にLFがCRLFに変換されますよ」という情報で、基本的には問題ありません。
どうしても警告を消したい場合は、こうします。
git config --global core.safecrlf false
ただし、この設定は改行コードの変換をより寛容にするため、意図しない変換が起きる可能性があります。
トラブル2:変更していないのに全ファイルが差分として表示される
これは典型的な改行コード問題です。
まず、現在のcore.autocrlf設定を確認しましょう。
git config core.autocrlf
次に、以下の手順で改行コードを統一します。
# 設定を変更(falseまたはinput推奨)
git config core.autocrlf false
# すべてのファイルを再チェックアウト
git rm --cached -r .
git reset --hard HEAD
トラブル3:シェルスクリプトが動かない
Linuxで実行するシェルスクリプト(.shファイル)にCRLFが含まれていると、エラーが発生します。
この場合は、.gitattributesで明示的にLFを指定してください。
*.sh text eol=lf
既存のファイルの改行コードを変換するには、sedコマンドが便利です。
sed -i 's/\r$//' script.sh
これでCRLFがLFに変換されます。
トラブル4:チーム内で設定がバラバラ
これが一番厄介な問題ですね。
解決策は、.gitattributesファイルをリポジトリに追加することです。これなら、全員が同じ設定を自動的に使うようになります。
プロジェクトのルートに以下の内容で.gitattributesを作成しましょう。
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
そして、チームメンバー全員に以下の設定をしてもらうのがベストプラクティスです。
git config --global core.autocrlf input
どの設定を選べばいい?推奨設定まとめ
状況別に、おすすめの設定をまとめておきます。
チーム開発の場合(最推奨)
プロジェクトのルートに.gitattributesを作成し、以下を記述します。
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
各メンバーのcore.autocrlfはinputまたはfalseに設定してもらいましょう。
git config --global core.autocrlf input
この組み合わせが最も安全で、トラブルが少ないです。
Windows単独開発の場合
git config --global core.autocrlf true
ただし、Linuxサーバーで動かすコードを書いている場合は、inputの方が安全ですね。
Mac・Linux単独開発の場合
git config --global core.autocrlf input
または、完全に無効化しても問題ありません。
git config --global core.autocrlf false
すでに改行コードが混在しているプロジェクトの場合
まず.gitattributesを追加し、その後で改行コードを統一します。
# .gitattributesを作成してコミット
git add .gitattributes
git commit -m "改行コード設定を追加"
# 既存ファイルを正規化
git rm --cached -r .
git add .
git commit -m "改行コードをLFに統一"
まとめ:改行コードとうまく付き合うために
Gitで改行コードを適切に扱うポイントをおさらいしましょう。
基本的な考え方
- リポジトリ内は
LFで統一するのが現代の標準 - ローカル環境では各OSの標準を使ってもOK
- チーム全体で設定を統一することが重要
推奨される設定方法
.gitattributesをリポジトリに追加(* text=auto)- 各メンバーは
core.autocrlf=inputまたはfalseに設定 - 必要に応じて特定ファイルタイプの改行コードを明示
トラブル時の対処
- 差分表示では
--ignore-space-at-eolオプションを活用 - 警告が出ても、それが正常な動作の場合もある
- 改行コード問題の多くは
.gitattributesで解決できる
最近のエディタやIDEはどちらの改行コードも問題なく扱えるので、「リポジトリ内は常にLF」という方針で統一するのが最もシンプルで安全です。
改行コードの設定を正しく理解して、スムーズなチーム開発を実現しましょう!


コメント