VSCode中git push失败但本地commit正常,大概率是SSH密钥未正确配对;需检查remote URL协议类型、~/.ssh/config中Host别名与IdentityFile绝对路径是否匹配,并确保ssh-agent已加载对应私钥。

VSCode里git push失败但本地commit正常,大概率是SSH密钥没配对
常见现象:你在 VSCode 里 commit 成功,但点击 Push 按钮时弹出 Permission denied (publickey) 或直接卡住;终端里执行 git push 同样报错。这不是 VSCode 的问题,而是 Git 正在用默认密钥(比如 ~/.ssh/id_rsa)去连远程主机,而该密钥没被 GitHub/GitLab/Gitee 添加为授权公钥。
- 先确认当前仓库用的是 SSH 还是 HTTPS 协议:
git remote get-url origin—— 如果返回git@github.com:xxx/yyy.git就是 SSH;如果是https://...则走 HTTPS 认证,和 SSH 密钥无关 - SSH 协议下,Git 不读
user.name和user.email来决定用哪把密钥,它只看远程 URL 里的Host部分,再查~/.ssh/config中对应Host的IdentityFile - 别指望 VSCode 自动帮你选密钥——它只是调用系统
git命令,密钥选择完全由 OpenSSH 决定
~/.ssh/config 必须按 Host 名匹配,不是按域名硬写
很多人把 Host github.com 直接写死,结果多个账号全撞一起。正确做法是给每个账号起一个唯一 Host 别名,比如 github-work、gitlab-personal,然后在克隆或配置 remote 时显式使用它。
- 编辑
~/.ssh/config(Windows 是%USERPROFILE%\.ssh\config),确保格式严格:每段Host开头,缩进必须用空格(不能用 Tab),IdentityFile路径要绝对且可读 - 示例:
Host github-work HostName github.com User git IdentityFile ~/.ssh/id_ed25519_work Host github-personal HostName github.com User git IdentityFile ~/.ssh/id_ed25519_personal
- 克隆时必须用这个别名:
git clone git@github-work:org/repo.git,而不是git@github.com:org/repo.git - 已有仓库想换账号?改 remote URL:
git remote set-url origin git@github-personal:username/repo.git
VSCode 里改 remote URL 后,还要单独设 user.email 和 user.name
SSH 密钥管认证,但提交记录里的作者信息由 Git 的 user.name 和 user.email 决定。VSCode 不会自动根据 remote URL 切换它们——你得手动配,否则所有提交都显示同一个邮箱。
- 进项目根目录终端(VSCode 里 Ctrl+`),运行:
git config user.name "Your Work Name"和git config user.email "work@company.com" - 不要加
--global!否则又全局污染了。只对当前 repo 生效才安全 - 验证是否生效:
git config user.email—— 应该输出你刚设的邮箱,不是全局值 - 如果项目已存在,旧提交的 author 信息不会变;新 commit 才会用新配置
Windows 上 ssh-agent 不自动加载私钥,得手动 add
Linux/macOS 通常开机就启 ssh-agent 并 load key,Windows(尤其 Git Bash + VSCode 组合)经常漏这步,导致 git push 仍提示权限拒绝,哪怕 ~/.ssh/config 完全正确。
- 打开 VSCode 集成终端,先启动 agent:
eval $(ssh-agent -s) - 再加载私钥:
ssh-add ~/.ssh/id_ed25519_work - 检查是否成功:
ssh-add -l应该列出你刚 add 的密钥指纹 - 每次新开终端都要重复?可以写个脚本或设终端启动命令,但更稳妥的是:用 Windows 自带的 OpenSSH Agent 服务(设置 → 服务 → OpenSSH Authentication Agent → 设为自动启动),然后在
~/.ssh/config加一行ForwardAgent yes
最常被忽略的其实是 ssh-add 这一步——配完 config 以为万事大吉,结果 agent 根本没拿到私钥,VSCode 里的 Push 按钮永远在转圈。











