Git 初期設定

## 目的

Gitの初期設定を行います。

## Gitシリーズ記事まとめ

https://qiita.com/ucan-lab/items/33c63a402f533aa92f3e

## 設定確認

### git バージョン確認

```
$ git --version
git version 2.38.0
```

まず、MacにインストールされているGitのバージョンを確認しておきましょう。
Windowsと違ってMacはGit標準搭載されているので良きです。

万が一、Gitのバージョンが1系であればアップデートしておいた方が良いでしょう。

### git 設定確認

```
* ローカルの設定
$ git config -l
* グローバルの設定
$ git config --global -l
```

### 設定ファイルの場所

- Local: `.git/config` 各対象のリポジトリの.gitディレクトリ
- Global: `~/.gitconfig`

基本はLocalとGlobalの設定ファイルの場所だけ覚えておけばokです。
設定ファイルはコマンドから書き換えることを推奨します。
直接書き換えてしまってもokです。

## Git初期設定手順(必須)

### git ユーザー名、メールアドレスの設定

ユーザ名、メールアドレスは必ず設定しておきます。
公開リポジトリだとWebから見られてしまうので、本名は設定しない方が無難です。

```
$ git config --global user.name "ゆうきゃん"
$ git config --global user.email "ucan-lab@example.com"
```

### ディレクトリ、ファイル設定

```
$ mkdir ~/.ssh
$ touch ~/.ssh/config
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/*
$ xattr -cr ~/.ssh
```

必要に応じて実行してください。
パーミッションはディレクトリは`700`、ファイルは`600`である必要があります。
`xattr` コマンドでMacの拡張ファイル属性(extended attributes)、いわゆるアットマークが付いてるのを削除できます。

### ssh config

```
$ vi ~/.ssh/config

Host *
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  ServerAliveInterval 15
  ServerAliveCountMax 30
  AddKeysToAgent yes
  UseKeychain yes
  IdentitiesOnly yes
```

- `Host *` 全ホストの共通設定
- [OpenSSHの警告メッセージを非表示](https://qiita.com/shotaTsuge/items/48bdaccdafa5475d9016)
  - `StrictHostKeyChecking no`
  - `UserKnownHostsFile=/dev/null`
- [SSH接続のタイムアウト設定](https://qiita.com/tailak/items/7784016feeea3def9576)
  - `ServerAliveInterval 15`
  - `ServerAliveCountMax 30`
- [入力したパスワード/鍵の省略設定](https://qiita.com/ken0909/items/5e5a1dda60effb162d55)
  - `AddKeysToAgent yes`
  - `UseKeychain yes`
- 認証の際に、ssh_config ファイルで指定された秘密鍵のみを使用するよう指定
  - `IdentitiesOnly yes`
  - [configを書くことでsshを便利で簡単にしよう！](https://koejima.com/archives/583)

### メールアドレスのプライバシー設定

https://github.com/settings/emails

プライベートなメールアドレスが表示されるのが嫌な場合は
`Keep my email address private` にチェックを入れて、 
`ID+ユーザー名@users.noreply.github.com` を `user.email` に設定しましょう。

## global .gitignore 設定(推奨)

`~/.config/git/ignore`

```shell-session
$ mkdir -p ~/.config/git
```

ディレクトリがない場合作成する。

```
.DS_Store
```

[[Git] .gitignoreの仕様詳解](https://qiita.com/anqooqie/items/110957797b3d5280c44f)

## Git初期設定(お好み)

ユーザー名とメールアドレスの設定以外はお好みです。

### git rebase 対話モード時にも標準モードのようにブランチを更新する

Git v2.38.0 以降のオプションです。

```
$ git config --global rebase.updateRefs true
```

https://github.blog/2022-10-03-highlights-from-git-2-38/

### git push 時に同じ名前のリモートブランチを作成する

```
$ git config --global push.default current
```

https://qiita.com/ucan-lab/items/c65297c062b477be01e5

### デフォルトブランチを main に変更する

※ 2020/10/1 からデフォルトブランチがmasterからmainに変更されました。

[The default branch for newly-created repositories is now main](https://github.blog/changelog/2020-10-01-the-default-branch-for-newly-created-repositories-is-now-main/)

```
$ git config --global init.defaultBranch main
```

設定不要かもしれませんが、git init時のデフォルトブランチを指定できます。

### git fetch --prune オプションを常に有効化

```
$ git config --global fetch.prune true
```

`--prune` オプションは削除されたリモートの追跡ブランチをローカルリポジトリに反映します。

### git status 追跡されていないファイルはすべて表示

```
$ git config --global status.showUntrackedFiles all
```

追跡されていないファイルはすべて表示させたい。
※設定しておかないと新規ディレクトリ配下のファイルが表示されなかったりする。

### 改行コードの自動変換機能

```
$ git config --global core.autocrlf input
```

`input` の場合は改行コードをコミット時に `LF` に変換してくれます。
(Mac, Linuxは `LF`, Windowsは `CRLF` がデフォルトの改行コードです。)

この自動変換を無効にしたい場合は `false` を設定してください。

### git パーミッションの変更を無視する

```
$ git config --global core.filemode false
```

チーム開発時は他の人と合わせましょう。
通常はパーミッション情報までコミットする必要はないはずです。

### git ファイル名の大文字・小文字の変更を検知する。

```
$ git config --global core.ignorecase false
```

ファイル名の大文字・小文字だけを変更することは希にあるので、この設定は割と重要かもです。

:::note warn
以前、大文字・小文字のファイル名修正がコミットされていないことに気付かず、
ローカルではMacやWindowsでは大文字・小文字を区別しないボリュームフォーマットになってることもあり、ローカル環境では正常に動作するが、本番環境のLinux環境ではファイル名とクラス名の大文字・小文字が一致しないことでエラーになってハマったことがあります。
:::

### git 日本語ファイル名をエスケープせずに表示

```
$ git config --global core.quotepath false
```

`git status` した時に日本語ファイル名があっても見やすく表示してくれます。

### マージコンフリクトを見やすくする

```
$ git config --global merge.conflictStyle zdiff3
```

Git v2.35.0で `zdiff3` オプションが追加されました。

https://git-scm.com/docs/git-config#Documentation/git-config.txt-mergeconflictStyle

https://qiita.com/yshd/items/3563a57e973da1f1f869

## 設定まとめ

```
git config --global rebase.updateRefs true
git config --global push.default current
git config --global init.defaultBranch main
git config --global fetch.prune true
git config --global status.showUntrackedFiles all
git config --global core.autocrlf input
git config --global core.filemode false
git config --global core.ignorecase false
git config --global core.quotepath false
git config --global merge.conflictStyle zdiff3
```

## Git CLIツール

- https://github.com/jesseduffield/lazygit
- https://github.com/github/hub
- https://github.com/jonas/tig
- https://github.com/junegunn/fzf
- https://github.com/tpope/vim-fugitive

詳細は [Git使うのに便利なCLIツール](https://qiita.com/ryuichi1208/items/45fd2cdd865097a7ad3d) の記事に詳しくまとめられています！

## 次回

- [Mac GitHub SSH接続設定](https://qiita.com/ucan-lab/items/e02f2d3a35f266631f24#_reference-7cbea668d512073f0df4)

GitHub SSH接続設定も合わせて行いましょう！

## 参考

- https://qiita.com/kozo/items/08dc2b86ae3ba3f282c3
- https://qiita.com/ttskch/items/5276f056517d191e19b5
- https://qiita.com/wnoguchi/items/f7358a227dfe2640cce3
- https://yu8mada.com/2018/08/19/after-changing-git-s-merge-conflictstyle-from-merge-to-diff3-merge-conflicts-became-easier-to-resolve
- https://qiita.com/ryuichi1208/items/45fd2cdd865097a7ad3d
- https://qiita.com/m-yamazaki/items/45ea4a71ebb769995043