Git003:Gitと文字コード VS code

### Gitは基本的にはUTF-8で管理される
なので、ソースコードもUTF-8で作るのが一番いいです！！！

完！！

### でも、ずっとShift-JISでやってきたのを今さら変えられませんよね

戦略としては3つ考えられますよね。
×? 1:  決まった拡張子のFileのEncodeをGitでS-JIS(CP932)に変えさせる。
○ 2:  Gitに勝手に文字codeを変更させない。
○ 3:  GitでどうしてもUTF-8でしか管理しない場所は無視する。

私が調べた結論は2と3で対応が良いと考えます。

### WindowsではGitでのEncode変換はできないのかも
1のEncodeを変える方法は下記のような設定らしいですが、WindowsではErrorが出ることがあります。
```terminal:.gitattributes
#リポジトリのルートに.gitattributesの設定Fileを追加する。
#試してみてもいいが、Windowsでは変換エラーが出る気がする。
*.c text working-tree-encoding=CP932
*.cpp text working-tree-encoding=CP932
*.h text working-tree-encoding=CP932
```
```
fatal: failed to encode '<File名>' from CP932 to UTF-8
```


この.gitattributesの正体は下記のようなFile変換だと思われますが、Windowsにはiconvが標準で入っていないのでErrorになるのだと思います。
```terminal:cmd
iconv -f CP932 -t UTF-8 input.txt -o output.txt
```

このErrorによってMergeなどの処理が先に進めなくなることが有るのでWindowsなら使用しない方がいいでしょう。
というか、文字codeをGitに勝手に変えさせるのは誤動作起こしそうだからWindows以外もやらない方がいいのでは？

### VS codeの表示をShift JisをDefaultにしましょう。
とりあえず、VS codeの左下の歯車をクリックしてfiles.encodingの設定をShift Jisにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884555/9c8a00d7-f23b-a2d9-5f7a-a06d06059f9f.png)


### 実はGitは基本的には文字codeを保持してくれてる気がする。勝手に変えてるのは改行コードだ！
Windows版のGitは標準的にはrepositoryのFileの改行を全てLFで管理するように考えられており、下記の運用で考えられています。
・commitする段階で改行をCRLF→LFに変換する。
・checkoutの段階で改行をLF→CRLFに変換する。

repositoryを複数人で管理する場合はこの改行自動変換設定(autocrlf)の統一が必要です。
そうでないと、自動変換有効でcommitしているのに、ある人は無効にしていて改行がLFでcheckoutしてしまい、全ソースの改行がおかしくなるという事が起こります。

Gitの方針がLFで統一なので複数人管理であればtrueが良いでしょう。

・autocrlfの設定を変えた場合は、一度localのrepositoryは全削除してRemoteからCloneしましょう。途中で設定を変えた後にcheck outしても改行変換されないようです。

・LFの改行で登録したFileは多くの場合、check out時にLFで取得できるようです。

・CRLFとLFが混ざっている場合、自動的にCRLFに統一してくれたりします。
　→これ、Excelのセル内改行LFみたいなFileとかバイナリやばくね？
 　一部特殊なファイルは気を付けた方がいいかも？

ただ、完全かというとたまにLFだったはずがCRLFに変換され、意味が分からない時もあるような？
Linux PCとWindows PCの使用者を混ぜて管理した場合もどうなるんだろう？
とはいえ、多くの場合はcrlfの設定さえ統一すれば大きく問題になる事はなさそう。

しばらく問題が発生するかもしれませんが、将来的には改行コードが揃うようになるはずです。

```terminal:cmd
git config core.autocrlf true
git config --global core.autocrlf true
```

ただ、Gitが勝手に変換するので、自分の意図しない問題が発生することも有るかもしれません。
個人で作業していてこの辺に関わりたくないならfalseも有りかもしれません。
```terminal:cmd
git config core.autocrlf false
git config --global core.autocrlf false
```
※上記コマンドのtrue,falseを省くと現在の状態を見られます。

ちなみに、設定は下記に保存されています。
``` terminal:.git\config
[core]
	autocrlf = true
```



### Gitの表示に騙されるな！文字化けしていてもCommitされるFileは正しい時もあるぞ！正しい表示はChangesだ！
autocrlfを変更しても、Diff画面に文字化けが発生してるんですけどって思った人はいると思います。
実は、表示に騙されているかもしれません。


＜大原則＞
File Changesの段階では登録した文字codeのままです。

＜gitの不親切な挙動＞
- StagingするとUTF-8表示になることがある気がします。
恐らくは最終的にはUTF-8 LFでサーバーに登録されるので、Stagingの段階でその表示になっているのかもしれません。commit後の段階では登録した状態に戻るんですよね。
よって、StagingのDiff結果は無視しましょう。
- MergeコマンドでConflictが起こったFileはUTF-8になっていることがあります。

＜文字化け回避方法＞
1. Diffを確認したいなら一度Changing状態に戻します。  
2. Merge中なら一度Merge完了させるとStaging状態になるので→Changingにする。
3. Mergeした時にUTF-8へ変換されている場合、
手動でS-JISの文字Code書き換えやFileの上書きをします。
4. Changing状態で文字化けが見当たらなくなったらStagingしてCommit。
   
 
### おまけ：Git GraphはShift JIS表示に対応していない気がする・・のは気のせいだった。
少なくとも私はVS codeの拡張機能のGit Graphの変更SourceのDiff表示でUTF-8以外に設定する方法は知らないです。
Git HistoryであればShift JIS表示ができるのでこちらを使うといいでしょう。
→コメントで情報を頂きました。（情報ありがとうございます。）
設定の下記の場所を変えれば良いようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884555/87b88e82-faa9-4d14-a96c-73cd800be366.png)