GitHub 複数アカウント運用 ─ SSH 切り替えでつまずいた話と、PAT + GCM に逃げてラクした話

## 初めに
皆さんは普段、Githubを使っていてアカウント切り替えにつまづいたことありませんか？仕事用のアカウントとプライベート用のアカウントの切り替え、案件ごとのアカウント切り替え、etc...

初心者からするとミスったら結構厄介だし、うまく管理するのもなかなか大変だと思います。今回は、カッコよくアカウント管理しようとして妥協した新米エンジニアのお話です（）

## Githubの主な認証方法
Githubにローカルから接続する際、主にSSH接続とPAT(personal access token)を使う方法の二パターンがあると思います。それぞれの違いは以下です。
* **SSH の Host エイリアス運用は“正攻法”だけど、初学者は細かい落とし穴が多くて時間が溶ける。**
→私も `"Permission denied"` 連発 → 色々設定してみるもなんだかんだ上手くいかず諦めました、、、

* **PAT + Git Credential Manager(GCM)を活用する。**
→雑に言ってしまえばめんどくさい設定をGithubとGoogle(などの認証)が勝手にやってくれるのでシンプル

---

## なぜ SSH エイリアスは難しいのか

SSH接続をする場合これらの問題にそつなく対処する必要があります。この辺の知識が不十分だと無限エラー地獄に、、、

**個々の説明がようわからんって人は最初からPAT＋GCMでやる方が安全です。**

| 罠                                 | 具体例                                    | 心が折れるポイント                            |
| --------------------------------- | -------------------------------------- | ------------------------------------ |
| **remote URL が alias じゃない**       | `git@github.com:user/repo.git` のまま     | `.ssh/config` が読まれず永遠に publickey エラー |
| **鍵が ssh-agent / Keychain に載らない** | `ssh-add` していない or `AddKeysToAgent` 無し | 毎 push で passphrase 入力 or 鍵が見付からず失敗  |
| **鍵パーミッション**                      | `chmod 600` 忘れ                         | `UNPROTECTED PRIVATE KEY FILE!` 警告   |
| **submodule が https**             | main は SSH、submodule は https           | push/pull の度に資格情報が混乱                 |
| **ネットワークで 特定のポートが閉じられている**             | 特定のWi-Fi からだけ失敗                         | `Port 443` や `ssh -T` 診断が必要          |

:::note warn
⚠️ **初学者がこれらを全部潰すには学習コストが高いし時間がかかる。**
:::

---

## PAT + GCM が秒で終わる理由

1. **HTTPS はすべての環境で通る** → ポート閉鎖・ファイアウォール無関係。
2. **GCM が Keychain に安全保存** → 1 度 PAT を入れたら再認証なし。
3. **ユーザー名ごとに資格情報を分けられる** (`credential.useHttpPath true`)。
4. GUI ポップアップでミスに気づきやすく、ログも "Failed to refresh token" とわかりやすい。
5. SSH 鍵管理を覚える前に **とりあえず仕事が回る**。

---

## 3. PAT + GCM 最速セットアップ（所要時間: 5 分）

> macOS (Apple Silicon) + zsh + Homebrew環境の場合

HomeBrewをインストールしていない方はこちら参考に入れてください。

https://qiita.com/zaburo/items/29fe23c1ceb6056109fd

```zsh
# 1. GCM インストール
arch -arm64 brew install --cask git-credential-manager-core

# 2. グローバル設定
#    ※ useHttpPath = true で account ごとに認証情報を分離
git config --global credential.helper "manager"
git config --global credential.useHttpPath true

# 3. 既存の怪しい資格情報を掃除
git credential-manager erase <<EOF
protocol=https
host=github.com
EOF

# 4. GitHub (各アカウント) ▶ Settings ▸ Developer settings ▸ Personal access tokens ▸ “Fine‑grained token” を作成
#    - 対象リポジトリを選択 (All repositories でも可)
#    - 権限は Contents → Read & write があれば充分
#    - Expiration は 90 days など短めでも OK（後で再発行できる）

# 5. いずれかの `git pull` / `git push` を実行すると GCM がブラウザを開く
#    - GitHub にログイン → 手順 4 の PAT を貼り付けて認可
#    - 完了すると GCM が Keychain に保存、以後は自動認証でノンタッチ
```
![スクリーンショット 2025-05-06 20.57.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632067/1e66fe00-83c6-4cea-8eb2-af643bd212b3.png)

![スクリーンショット 2025-05-06 20.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632067/2fa209dc-df37-49d9-9e82-ad111dbf34f7.png)


---

## 4. 両者の比較

| 項目           | SSH エイリアス              | PAT + GCM          |
| ------------ | ---------------------- | ------------------ |
| セットアップの学習コスト | ★★★☆☆ (鍵/agent/alias)  | ★☆☆☆☆ (GUI 指示通り)   |
| ポート制限耐性      | △ (22 番閉じたら追加設定)       | ◎ (HTTPS 443)      |
| セキュリティ       | ◎ (鍵が最強)               | ○ (PAT 有効期限管理が必要)  |
| 利用シーン        | OSS 貢献, CI/CD, VPN 内 | 私用/業務混在, 速攻で動かしたい時 |
| ハマりどころ       | remote URL, agent      | PAT 失効, GCM ポップアップ |

---

## 5. それでも SSH に再挑戦したい人へ

> 自分でも上手く行ってないのでもう少し理解したら加筆します。

---

## 6. まとめ

* **時間がないorかけたくないなら PAT + GCM が最速最小ストレス**。
* **学習も兼ねてセキュア運用を極めたいなら SSH**。
* いずれ鍵管理に慣れたら **Hybrid (仕事→SSH / 私用→GCM)** もあり。

---

### 参考リンク

* [Git Credential Manager Docs](https://aka.ms/gcm)
* [Git – Conditional includes](https://git-scm.com/docs/git-config#_conditional_includes)
* [GitHub Docs – Creating a personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)