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/ に分かれているなら、.gitconfigincludeIf で自動切り替えできる。

# ~/.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 でホスト別管理
ディレクトリ別自動切替.gitconfigincludeIf を使う

user.name / user.email の設定とキャッシュされた認証情報は別物であることを覚えておくと、このトラブルの原因を素早く特定できる。