Gitでpushできない原因と対処法|permission denied (publickey) エラーの解決手順

① 結論

結論:
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接続で作業を継続

コメント

タイトルとURLをコピーしました