Gitは、ソースコード(テキストファイル)管理ツールなので、バイナリファイルの管理は苦手です。
差分出力でファイルを壊しているので、バイナリファイルに対して差分出力できなくします。
たとえば、バイナリファイルの拡張子が *.exe だとしたら、管理下のルートディレクトリに .gitignoreファイルを作成して、以下のように記述します。
*.exe binary
以下のように記述しても同じです。
*.exe -crlf -diff
テキストとバイナリを管理するのだったらsubversion(TortoiseSVN http://tortoisesvn.net/)の方がいいと思います。
少々長い引用ですが、公式のドキュメントの翻訳を引用します。
バイナリファイルの特定
テキストファイルのように見えるファイルであっても、何らかの目的のために意図的にバイナリデータとして扱いたいこともあります。たとえば、Mac の Xcode プロジェクトの中には .pbxproj で終わる名前のファイルがあります。これは JSON (プレーンテキスト形式の javascript のデータフォーマット) のデータセットで、IDE がビルド設定などをディスクに書き出したものです。すべて ASCII で構成されるので、理論上はこれはテキストファイルです。しかしこのファイルをテキストファイルとして扱いたくはありません。実際のところ、このファイルは軽量なデータベースとして使われているからです。他の人が変更した内容をマージすることはできませんし、diff をとってもあまり意味がありません。このファイルは、基本的に機械が処理するものなのです。要するに、バイナリファイルと同じように扱いたいということです。
すべての pbxproj ファイルをバイナリデータとして扱うよう Git に指定するには、次の行を .gitattributes ファイルに追加します。*.pbxproj -crlf -diff
これで、Git が CRLF 問題の対応をすることもなくなりますし、git show や git diff を実行したときにもこのファイルの diff を調べることはなくなります。Git 1.6 系では、次のようなマクロを使うこともできます。これは -crlf -diff と同じ意味です。
https://github.com/progit/progit.github.com/blob/master/translations/ja/07-customizing-git/01-chapter7.markdown*.pbxproj binary
同じファイルに記載がありますが、git に commit する環境が Windows に限定できるなら autocrlf = false でも良いと思います。
往々にして、当初の想定は崩れるのが常ですが。
これは、Git だけではなく Subversion や CVS などでも同じことです。
バイナリファイル、例えばexeファイルのdiffを取りたいが壊したくないということならば、
*.exe -crlf
git config --global core.autocrlf input