GitHub アカウントを切り替えるときに Windows 資格情報を削除して再認証する手順
GitHub のアカウントを切り替えようとしたとき、git push が旧アカウントで実行されてしまう問題に遭遇した。
原因は Windows の資格情報マネージャーに古いアカウントの認証情報がキャッシュされていたため。
git config を変更しても push 時の認証だけ旧アカウントのままになる、という挙動で少しはまったのでまとめておく。
環境
- Windows 11(WSL2 ではなく Windows ネイティブの Git)
- 認証方式: HTTPS(Personal Access Token または OAuth)
- Git for Windows
なぜこうなるのか
Git の「誰として push するか」は 2 つの情報が関係している。
| 設定 | 役割 | 保存場所 |
|---|---|---|
user.name / user.email | コミットのメタデータ | .gitconfig |
| 認証情報(トークン) | サーバーへのアクセス権 | 資格情報マネージャー |
この 2 つは独立して管理されているため、git config だけ変更しても認証情報は旧アカウントのまま残る。
コミットの著者は新アカウントになるが、push 時の権限チェックは旧アカウントのトークンで行われるため、他人のリポジトリに push しようとしているように見えてエラーになったり、意図しないアカウントで push されたりする。
HTTPS 認証の切り替え手順
1. Windows 資格情報マネージャーを開く
スタートメニューで「資格情報マネージャー」と検索して開く、または以下で直接起動。
Win + R → control /name Microsoft.CredentialManager
「Windows 資格情報」タブを選択する。
2. GitHub の資格情報を削除する
github.com に関連するエントリを探す。以下のような名前で登録されている。
git:https://github.com
または
GitHub for Windows
エントリを展開して「削除」をクリックする。複数ある場合はすべて削除する。
3. git config のユーザー情報を確認・更新する
グローバル設定に旧アカウントの情報が残っている場合は更新する。
# 現在の設定を確認
git config --global user.name
git config --global user.email
# 新しいアカウントに変更
git config --global user.name "新しいユーザー名"
git config --global user.email "新しいメールアドレス"
リポジトリごとに切り替えたい場合は --global を外してリポジトリのルートで実行する。
git config user.name "新しいユーザー名"
git config user.email "新しいメールアドレス"
4. push して再認証する
git push
実行するとブラウザまたはターミナルで認証ダイアログが開く。新しいアカウントでログインすれば完了。
認証が完了すると資格情報マネージャーに新しいアカウントの情報が自動保存され、次回以降は入力不要になる。
複数アカウントを常に使い分けたい場合は SSH がおすすめ
仕事用と個人用など、複数アカウントを常に切り替えながら使うなら SSH 鍵を使う方法が管理しやすい。HTTPS + 資格情報マネージャーは 1 アカウントしか保持できないが、SSH は鍵ファイルとホスト名の組み合わせで複数アカウントを共存できる。
SSH 鍵を 2 つ作成する
# 個人アカウント用
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519_personal
# 仕事用
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519_work
~/.ssh/config にホスト別設定を追加する
# 個人アカウント
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
# 仕事用アカウント
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
各 GitHub アカウントに公開鍵を登録する
# 公開鍵をクリップボードにコピー
cat ~/.ssh/id_ed25519_personal.pub | clip # Windows
cat ~/.ssh/id_ed25519_personal.pub | pbcopy # Mac
GitHub → Settings → SSH and GPG keys → New SSH key で登録する。
リモート URL をホスト別に設定する
# 個人用リポジトリ
git remote set-url origin git@github-personal:username/repo.git
# 仕事用リポジトリ
git remote set-url origin git@github-work:work-org/repo.git
ディレクトリごとに自動切り替えする方法(上級)
プロジェクトが ~/personal/ と ~/work/ に分かれているなら、.gitconfig の includeIf で自動切り替えできる。
# ~/.gitconfig
[user]
name = personal-name
email = [email protected]
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
# ~/.gitconfig-work
[user]
name = work-name
email = [email protected]
~/work/ 以下のリポジトリでは自動的に仕事用の設定が使われる。手動で切り替える必要がなくなるのでミスが減る。
WSL2 での注意点
WSL2 から Windows ネイティブの Git を呼んでいる場合、資格情報マネージャーの扱いが変わる。
WSL2 内の Git は /etc/gitconfig や ~/.gitconfig を参照するが、資格情報ヘルパーが Windows 側の Git Credential Manager (GCM) を向いていることがある。
# WSL2 内で確認
git config --global credential.helper
# → /mnt/c/Program Files/Git/mingw64/bin/git-credential-manager
# のようなパスが出ればWindowsのGCMを使っている
この場合は Windows 資格情報マネージャーを操作することで WSL2 内の Git の認証情報もリセットできる。
WSL2 内で完結させたい場合は以下のように設定を切り替える。
git config --global credential.helper store
# ~/.git-credentials に平文保存(セキュリティに注意)
または git config --global credential.helper cache でメモリにキャッシュする方法もある。
トラブルシューティング
資格情報を削除しても旧アカウントで push される
Git for Windows に組み込みの credential helper が別に動いている場合がある。
git config --system credential.helper
git config --global credential.helper
git config --local credential.helper
3 層すべてを確認し、想定外の credential helper が設定されていないか確認する。
push 時に 403 エラーが出る
新しいアカウントで再認証できているが、リポジトリへのアクセス権がない場合に 403 になる。 Organization のリポジトリの場合は、Organization 設定で PAT(Personal Access Token)に SSO 認可が必要なことがある。
GitHub → Settings → Developer settings → Personal access tokens → 対象トークン → Configure SSO から認可する。
GitHub CLI を使っている場合
gh コマンドの認証は資格情報マネージャーとは別に管理されている。アカウントを切り替えるには以下を実行する。
gh auth logout
gh auth login
まとめ
| やること | コマンド・操作 |
|---|---|
| 資格情報を削除 | 資格情報マネージャー → git:https://github.com を削除 |
| ユーザー情報を更新 | git config --global user.name / user.email |
| 再認証 | git push → ブラウザでログイン |
| 複数アカウントを常用 | SSH 鍵 + ~/.ssh/config でホスト別管理 |
| ディレクトリ別自動切替 | .gitconfig の includeIf を使う |
user.name / user.email の設定とキャッシュされた認証情報は別物であることを覚えておくと、このトラブルの原因を素早く特定できる。