大家好,今天来解决一个很多同学在Git+GitHub使用中会踩的坑:明明已经在GitHub账号里配置好了SSH密钥,结果推送代码时还是弹出“输入用户名密码”的登录提示——这问题我自己刚开始用Git的时候也遇到过,今天就把原理和解决方法讲透。
一、问题根源:你用的是HTTPS协议,不是SSH协议
核心矛盾:SSH密钥只对SSH协议的远程仓库地址生效,但你的本地仓库,现在绑定的是HTTPS协议的远程地址。
比如我执行git push -u origin main时,终端里弹出的是https://github.com开头的地址提示——这说明当前仓库用的是HTTPS协议,Git会默认用“账号+密码”的方式验证身份,完全不会调用你配置的SSH密钥。
先搞懂:HTTPS和SSH协议的区别
这两个是Git连接远程仓库的两种方式,认证逻辑完全不一样:
| 协议类型 | 地址格式示例 | 认证方式 | 是否依赖SSH密钥 |
|---|---|---|---|
| HTTPS | https://github.com/你的用户名/仓库名.git |
账号+密码(或PAT令牌) | 不依赖 |
| SSH | git@github.com:你的用户名/仓库名.git |
SSH密钥对 | 必须依赖 |
二、先验证:你的远程地址是不是HTTPS?
在本地仓库的终端里,先执行这条命令,看看当前远程地址的格式:
git remote -v
如果输出是下面这样(包含https://github.com/),那问题就实锤了——确实是HTTPS协议:
origin https://github.com/Yanxinwu946/pentest.git (fetch)
origin https://github.com/Yanxinwu946/pentest.git (push)
三、解决步骤:把远程地址切换为SSH格式
只需要把当前仓库的远程地址改成SSH协议,Git就会自动用SSH密钥认证,不用再输账号密码了。
步骤1:获取仓库的SSH地址
打开你的GitHub仓库页面,点绿色的“Code”按钮,选“SSH”选项,复制对应的地址(格式是git@github.com:你的用户名/仓库名.git):

步骤2:修改本地仓库的远程地址
在本地仓库的终端里,执行这条命令(把地址替换成你刚复制的SSH地址):
git remote set-url origin git@github.com:你的用户名/仓库名.git
步骤3:确认修改成功
再执行git remote -v,如果地址变成了git@github.com开头,说明改对了:
origin git@github.com:你的用户名/仓库名.git (fetch)
origin git@github.com:你的用户名/仓库名.git (push)
步骤4:测试推送(不用登录了!)
执行推送命令,这时候Git会自动用SSH密钥认证:
git push -u origin main
如果弹出类似Hi 你的用户名! You've successfully authenticated...的提示,说明SSH密钥生效了——这次推送完,后面就不会再要求登录了。
四、额外检查:确保SSH密钥全局能用
SSH密钥是用户级的全局配置(你电脑上所有Git仓库都能用),但得确认密钥配置没问题:
1. 检查本地有没有SSH密钥
执行这条命令,看看~/.ssh/目录下有没有密钥对:
ls ~/.ssh/
如果能看到id_rsa(私钥)和id_rsa.pub(公钥),说明密钥已经生成好了。
2. 测试SSH能不能连GitHub
执行这条命令,验证密钥是否能正常连接GitHub:
ssh -T git@github.com
如果输出Hi 你的用户名! You've successfully authenticated...,说明SSH密钥配置正确,所有仓库都能用这个密钥。
五、避坑技巧:以后别再踩同样的坑
1. 克隆仓库时直接用SSH地址
后面克隆GitHub仓库,直接选SSH地址克隆,就不用再改地址了:
git clone git@github.com:你的用户名/仓库名.git
2. 批量改已有仓库的地址(可选)
如果本地有很多仓库都是HTTPS地址,可以用脚本批量切换成SSH(以Linux/Mac为例):
# 假设你的仓库都存在~/git-repos目录下
find ~/git-repos -type d -name ".git" | while read gitdir; do
repo_dir=$(dirname "$gitdir")
cd "$repo_dir"
# 把HTTPS地址换成SSH格式
git remote set-url origin $(git remote get-url origin | sed 's/https:\/\/github.com\//git@github.com:/')
echo "已把仓库 $repo_dir 的地址改成SSH"
done
六、总结
一句话说清楚:配置了SSH密钥却还要登录,是因为远程仓库用的是HTTPS协议。只要把远程地址换成SSH格式,Git就会自动用密钥认证,彻底解决重复登录的问题。
原文 https://blog.csdn.net/2301_79518550/article/details/155619548