① 結論
結論:
git push 実行時に permission denied (publickey) が出る原因の多くは、
GitHubに登録されていないSSHキーを使っている、または意図しないSSHキーが使用されている
ことです。
正しいSSHキーを作成・登録し、リポジトリでそのキーが使われているかを確認すれば解決します。
GitHubはパスワード認証を廃止しているため、古い設定のままSSH接続していると、
このエラーは必ず発生します。
② 起きている症状
git push実行時にpermission denied (publickey)と表示される- pull はできるが push だけ失敗する
- HTTPS接続では動くが、SSH接続では失敗する
- 別のリポジトリでは push できる
③ よくある原因(優先度順)
原因①:GitHubにSSHキーが登録されていない
【詳細】
GitHubは2021年以降、パスワードによるGit操作を廃止しており、
SSH接続では必ずGitHubに登録された公開鍵が必要です。
SSHキーを作成していても、GitHub側に登録していない場合、
認証に失敗し permission denied (publickey) が表示されます。
起きやすい条件:
・PCを新しくセットアップした直後
・SSHキーを作成したがGitHubに登録していない
・GitHubアカウントを作り直した
判断ポイント:
以下を実行し、認証成功メッセージが出るか確認します。
ssh -T git@github.com
Hi ユーザー名! と表示されない場合、この原因に該当します。
原因②:意図しないSSHキーが使われている
【詳細】
複数のSSHキーが存在する環境では、
Gitが意図しないキーを自動選択し、GitHubに登録されていないキーで
認証を試みることがあります。
その結果、正しいキーを登録していても認証に失敗します。
起きやすい条件:
・複数のGitHubアカウントを使っている
・会社用/個人用でSSHキーを分けている
・~/.ssh に複数の秘密鍵が存在する
判断ポイント:
以下のコマンドで、どのSSHキーが使われているか確認します。
ssh -vT git@github.com
ログ中に表示される Offering public key の行で、
想定していないキーが使われている場合、この原因に該当します。
原因③:リポジトリへの書き込み権限がない
【詳細】
SSH認証自体は成功していても、
対象リポジトリに書き込み権限がない場合、
push時に拒否されることがあります。
特に、Fork元リポジトリや他人のリポジトリに対して
直接pushしようとすると発生します。
起きやすい条件:
・Forkしたリポジトリに直接pushしている
・チームからリポジトリ権限を付与されていない
判断ポイント:
GitHubのリポジトリ画面で「Settings → Collaborators」に
自分のアカウントが存在しない場合、この原因に該当します。
④ 切り分け手順(上から順に実行)
手順1:SSH認証が通るか確認
ssh -T git@github.com
ここで失敗する場合、原因①または②が確定します。
手順2:使用中のSSHキーを確認
ssh -vT git@github.com
想定外のキーが使われていないか確認します。
手順3:リポジトリ権限を確認
GitHub上でリポジトリの権限を確認します。
⑤ 具体的な解決方法
解決策①:SSHキーを新規作成して登録
ssh-keygen -t ed25519 -C "your_email@example.com"
cat ~/.ssh/id_ed25519.pub
表示された公開鍵をGitHubの
「Settings → SSH and GPG keys」に登録します。
解決策②:使用するSSHキーを明示的に指定
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
~/.ssh/config に上記を設定し、使用するキーを固定します。
解決策③:HTTPS接続に切り替える
一時的な回避策として、HTTPS接続に変更することも可能です。
⑥ 再発防止チェックリスト
- 1アカウントにつき1セットのSSHキーを使用する
- SSHキー作成後は必ずGitHubに登録する
~/.ssh/configで使用キーを明示する
⑦ それでも解決しない場合の次の一手
- GitHubの「Security log」で認証履歴を確認
- エラーメッセージ全文で再検索
- 最終手段としてHTTPS接続で作業を継続

コメント