Windows 10 と Powershell（WSL含む） で git を利用する

## はじめに

Windows 10 と Powershell で git を利用するための手順となります。
WSL（Windows Subsystem for Linux）で git を利用するための設定も含みます。

## 前提

- Windows 10 x64 での手順となります。
- Visual Studio Code x64 がインストールされていること。（VSCodeでgitの設定などを行います。）
- PowerShell がインストールされていること。（PowerShellでgitを操作します。）

## 参考にした情報

- [Git](https://git-scm.com/)
- [Gitドキュメント](https://git-scm.com/book/ja/v2)
- [私家版 Git For Windowsのインストール手順](http://opcdiary.net/?page_id=27065)

## Git のインストール

- Gitのインストーラーをダウンロードします。

    [Gitのダウンロードページ](https://git-scm.com/download/win)

- ダウンロードしたインストーラー（例：Git-2.26.2-64-bit.exe）を実行します。

- インストール先のパス（例：D:\Develop\Bin\Git）を指定します。

> 可能であればスペースを含まないパスが良いです。

- インストールするコンポーネントを選択します。

> 「Use a TrueType font in all console windows」をチェックすると文字化けするのでチェックしないこと。
> 必要に応じてデスクトップにアイコンを作成してください。

- デフォルトエディタとして「Use Visual Studio Code as Git's default editor」を選択します。

> デフォルトエディタは後で変更可能です。

- コマンドラインやPowerShellなどからGitのコマンドを利用するため「Git from the command line and also from 3rd-party software」を選択します。

> Unix互換環境などをすでに導入している場合は気を付けてください。

- HTTPトランスポートバックエンドとして「Use the OpenSSL library」を選択します。

- 改行コードは「Checkout as-is, commit as-is」を選択します。

> 環境によりますが、チェックアウトもコミットもそのままが無難です。

- コンソールは「Use Windows’s default console window」を選択します。

- キャッシュ（Enable file system cashing）は必要に応じて有効化します。 以下のコマンドでも設定できます。

```bash
$ git config --global core.fscache true
```

## Git のアップデート

- 基本的には新しいバージョンのセットアップを実行することで更新できます。

## Git のグローバル設定

- 「Git bash」を起動します。

- 以下のコマンドを入力してユーザーや日本語環境の設定を行います。

```bash
$ git config --global user.name "Mei Sei"         # 氏名の指定
$ git config --global user.email "hoge@email.com" # メールアドレスの指定
$ git config --global color.ui auto
$ git config --global core.quotepath false
$ git config --global --unset i18n.logoutputencoding
$ git config --global --unset i18n.commitencoding
$ git config --global --unset svn.pathnameencoding
```

- (WSLの場合)コミット時にパーミッションを無視するようにします。

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

## Git のBash関連設定

- (WSLの場合)必要に応じてWindowsのフォルダに対してシンボリックリンクを張ります。

```bash
$ cd ~
$ ln -s "/mnt/d/Develop/Git" ./git
$ cd git; mkdir prj; cd prj
$ git init
```

- (WSLの場合)シンボリックリンクを解除する場合はこのコマンドです。

```bash
$ unlink ./git
```

- (WSLの場合)下記のようなエラーが発生する場合は、マウントを解除したうえで、メタデータを除いてマウントします。

```bash
wsl chmod on config.lock failed: Operation not permitted ...

$ sudo umount /mnt/c
$ sudo mount -t drvfs C: /mnt/c -o metadata
$ sudo umount /mnt/d
$ sudo mount -t drvfs D: /mnt/d -o metadata
```

- (WSLの場合)Gitコマンドの補完を設定します。

```bash
# ~/.bashrcに追記します。
$ vi ~/.bashrc
source /usr/share/bash-completion/completions/git
```

- (WSLの場合)Gitステータスをコマンドラインに常時表示します。

```bash
# ~/.bashrcに追記します。
$ vi ~/.bashrc
source /etc/bash_completion.d/git-prompt
export PS1='\[\033[32m\]\u@\h \[\033[33m\]\w\[\033[36m\]$(__git_ps1)\[\033[0m\]\n$ '
GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUPSTREAM=auto
```

> これにより、コマンドラインにブランチ名や編集状態やコミット状態が表示されます。
> 表示される記号の意味。

```text
* ：更新(Modified)ファイルが有る
% ：新規(Untracked)ファイルが有る
+ ：ステージングされた(git add)ファイルが有る
$ ：git stashされたファイルが有る
# ：コミットが無い(git init直後)
> ：ローカルにコミットが有る(ローカルがリモートより進んでいる)
< ：リモートにコミットが有る(ローカルがリモートより遅れている)
<>：ローカルとリモート両方にコミットが有る(マージが必要)
```

## Git の初期化とコミットとリモート接続とプッシュとプル

```powershell
> git init (git 初期化)
> git add -A
> git commit -m "first commit"
> git remote add origin (url)
> git branch (ブランチ確認)
> git push --set-upstream origin master
> git pull origin master
```

## Git の他ヒストリからプッシュしている場合はマージやリベース

```powershell
! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/hoge/fuga.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

> git fetch origin master
> git merge --allow-unrelated-histories origin master

> git fetch origin master
> git rebase origin master
```

## Powershell で git diff が文字化けする場合

LANG 環境変数を設定します。

```powershell
> SETX LANG ja_JP.UTF-8
```

## Git のSSHキー作成

> githubを利用する場合はSSHキーの作成が必要になります。  
> 下記手順で作成したSSHキーをgithubのアカウントに登録します。

- 「Git Gui」を起動します。

- メニューのHelpからShow SSH Keyを選択します。

- 「Generate Key」をクリックします。

- パスフレーズを入力します。（2回入力）

- ~/.ssh配下に公開鍵(id_ras.pub)と秘密鍵(id_rsa)の二つのファイルが生成されます。

## posh-git のインストール

> Windows PowerShellでgitの操作を便利に行うために、posh-gitを導入します。

- 管理者権限でPowerShellのコンソールを起動して以下のコマンドを入力します。

```powershell
> Get-ExecutionPolicy
```

- コマンドの結果がRestrictedの場合は、署名付きのコマンドレットであれば使用できるようにセキュリティ設定を変更します。

```powershell
> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Confirm
```

- posh-gitをインストールします。

```powershell
> 初めてインストールする場合
> PowerShellGet\Install-Module posh-git -Scope CurrentUser -AllowPrerelease -Force
> アップデートなどする場合
> PowerShellGet\Install-Module posh-git -Scope CurrentUser
```

- posh-gitのモジュールを読み込みます。

```powershell
> Import-Module posh-git
```

- 自動でモジュールが読み込まれるようにPowerShellのプロファイルを変更します。

```powershell
> code $profile
```

```text
Import-Module posh-git
```

- PowerShellのプロファイルを再読み込みします。

```powershell
> . $profile
```

## Git bash のエディタの設定と利用

- 「Git bash」を起動します。

- コミットメッセージのエディタを変更する場合は、~/.gitconfigを編集します。

```bash
$ vi ~/.gitconfig
```

- 以下のように設定します。（Visual Studio Codeを利用する場合です。）

```bash
[core]
   editor = code --wait
```

- (参考)グローバル設定でも可能です。

```bash
$ git config --global core.editor "code --wait"
```

- (参考)プロジェクトのディレクトリを起点としてVisual Studio Codeを起動すると、Visual Studio Codeからgitを操作できます。

```powershell
$ code .
```

## Git bash でのlsコマンドの文字化け対策

- 「Git bash」を起動します。

- 以下のコマンドを入力して設定を行います。

```bash
$ vi ~/.profile
```

```bash
alias ls='ls --color=auto --show-control-chars'
alias ll='ls --color=auto --show-control-chars -l'
```

## さいごに

Windows 10 で Powershell と git と posh-git の組み合わせを利用してみました。