【Git】(メモ)複数のGitアカウントを使い分ける場合

# この記事を読んで欲しい人

- 複数のGitアカウントを使い分けたい
- 仕事用（メイン用）とプライベート用（サブ用）で使い分けたい


# 今回やったこと

- Macのターミナルで使用しているシェルであるzshの設定ファイルである./zshrcに、local.user/emailを設定するシェルスクリプトを記載
- sshキーを使い分けて、それぞれのアカウントのリポジトリへアクセス

# 手順

## 1. keyの作成

- メイン用とサブ用で使用するGitユーザー用をそれぞれ作成する

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):{好きな名前
}
```

## 2. それぞれのGitアカウントに鍵登録


- 先ほど作成した公開鍵をコピー
    - Mac：`$ pbcopy < ~/.ssh/{作成時の鍵名前}.pub`
    - Windows：`$ clip < ~/.ssh/{作成時の鍵名前}.pub`
- [git鍵設定画面](https://github.com/settings/keys)でコピーしたものを貼り付けて、好きな名前で登録

![CleanShot 2024-12-14 at 10.03.27@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1611984/3833db8b-1d54-da7a-692c-85258d8e4272.png)


## 3. ~/.ssh/configを記載（ない場合は作成して記載）

例：
```
＃　メイン用
Host github github.com
  HostName github.com
  User {メイン用のユーザー名}
  IdentityFile ~/.ssh/{メイン用のkeyname}

# サブ用
Host tiga-ga
  HostName github.com
  User {サブ用のユーザー名}
  IdentityFile ~/.ssh/{サブ用のkeyname}
```

## 4. 接続確認

例：

```
$ ssh -T git@github
Hi {メインユーザー名}! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T git@github.com
Hi {メインユーザー名}! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T git@tiga-ga
Hi {サブユーザー名}! You've successfully authenticated, but GitHub does not provide shell access.
```


## 5. zshの設定ファイルである./zshrcを更新

※zsh使っていない方は別のシェルの設定ファイルでも問題ないです！

`vi  ~/.zshrc`で編集

```
# メイン用（メインはglobalで設定）
function gitmain() {
  git config --global user.name "{メインgitユーザー名}"
  git config --global user.email "{メインgitメールアドレス}"
}
# サブ用（サブはlocalで設定）
function gitsub() {
  git config --local user.name "{サブgitユーザー名}"
  git config --local user.email "{サブgitメールアドレス}"
}
```

`source ~/.zshrc`で再読み込み


## 6.リポジトリクローン

リポジトリクローンする時は、SSH用のURL？をコピーしておく
![CleanShot 2024-12-14 at 11.07.00@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1611984/7b102fb1-638b-c7f6-24f5-e9a5acd743f2.png)

### メイン用のリポジトリをクローンする時

`git clone {コピーしたもの}`
詳しく書くと、
`git clone git@{メイン用のHost}:{ユーザー名}/{リポジトリ名}.git`
上記手順の~/.ssh/configの場合、
`git clone git@github.com:{ユーザー名}/{リポジトリ名}.git`

※~/.ssh/config記載時にメイン用のHostを`Host github github.com`ではなく、他の名前にした場合は、コピーしたものを編集してからクローンする必要あり

### サブ用のリポジトリをクローンする時

`git clone git@{サブ用のHost}:{ユーザー名}/{リポジトリ名}.git`
上記手順の~/.ssh/configの場合、
`git clone git@tiga-ga:{ユーザー名}/{リポジトリ名}.git`


## 7. プッシュしてみる


- （ホームディレクトリで1回だけ実行）まずは、gitのconfig情報(user.nameとuser.email)のglobal設定をするために、gitmainを実行する
※リポジトリごとに毎回実行する必要はなく、一回だけ打てば良い。だったらzshrcに書く必要がないかも、、
- `$ gitmain`を実行

このように設定されていればOK！

```
$ git config -l
...
user.name={メイン用ユーザー名}
user.email={メイン用メールアドレス}
...
remote.origin.url=git@{メイン用HostID}:{メインユーザー名}/{リポジトリ名}.git
...
```


### メイン用のリポジトリの場合

- `cd {クローンしたリポジトリ}`で移動して、そのまま変更してpushすればOK

### サブ用のリポジトリの場合

- `cd {クローンしたリポジトリ}`で移動
- （リポジトリごとに毎回実行）gitのconfig情報(user.nameとuser.email)のlocal設定をするために、`$ gitsub`を実行

このように設定されていればOK！

```
$ git config -l
...
user.name={メイン用ユーザー名}　※global
user.email={メイン用メールアドレス}　※global
...
remote.origin.url=git@{サブ用HostID}:{サブ用ユーザー名}/{リポジトリ名}.git
...
user.name={サブ用ユーザー名}　※local
user.email={サブ用メールアドレス}　※local
```

この場合、globalよりlocalの方が優先されるため、そのまま変更してpushすればOK


以下のブログは、gitconfigについて理解したい方におすすめです！

参考）[[Git]これだけ押さえる！gitconfigの基本](https://qiita.com/C_HERO/items/c35e679f0b03a5f06469)


# まとめ

複数のGitアカウントを管理したい方のお役に立てればと思います！！

:::note warn
警告
ここまでSSH接続でGitリポジトリへ操作する方法をご紹介しましたが、鍵がハードディスク上のユーザアクセスが可能なファイルとして保存されることが欠点。
 SSHキーの管理は気をつけましょう。
参考）[【解説】【GitHub】HTTPSとSSHの違い](https://zenn.dev/nameless_sn/articles/the_differences_between_https_and_ssh)
:::