使用SSH协议解决Git推送失败问题的具体操作方法

 更新时间:2026年01月01日 12:02:57   作者:STARBLOCKSHADOW  
在日常开发中,我们常常会遇到 Git 推送失败的问题,尤其是在初次配置远程仓库或网络环境受限的情况下,本文将详细介绍如何通过配置 SSH 协议解决 Git 推送失败问题,需要的朋友可以参考下

0 引言

在日常开发中,我们常常会遇到 Git 推送失败的问题,尤其是在初次配置远程仓库或网络环境受限的情况下。

如会出现类似如下的报错:

fatal: unable to access 'https://github.com/username/repo.git/': Recv failure: Connection was reset

本文将详细介绍如何通过配置 SSH 协议解决 Git 推送失败问题,并深入解析一个常见的错误场景:“fatal: refusing to merge unrelated histories”。

1 SSH 配置详解

1.1 为什么选择 SSH?

Git 支持 HTTPS 和 SSH 两种协议进行远程通信:

  • HTTPS:需要每次输入用户名和密码(或使用 token),容易受代理影响。
  • SSH:基于密钥认证,安全高效,且不受部分代理干扰,适合长期开发使用。

1.2 生成 SSH 密钥对

如果你尚未配置 SSH 密钥,可以在 Git Bash 通过以下命令生成并配置 SSH 密钥:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • -t rsa 表示使用 RSA 算法。
  • -b 4096 表示密钥长度为 4096 位,更安全。
  • -C 后面是注释,建议填写注册 GitHub 的邮箱。

系统会提示:

Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/XXX/.ssh/id_rsa):

直接回车即可(使用默认路径 /c/Users/XXX/.ssh/id_rsa

接着会提示:

Enter passphrase (empty for no passphrase):

可以选择输入一个密码(推荐),会要求二次输入确认,也可以直接按回车跳过。

成功后会显示:

Your identification has been saved in /c/Users/XXX/.ssh/id_rsa
Your public key has been saved in /c/Users/XXX/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXX your_email@example.com
The key's randomart image is:
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
……

1.3 添加公钥到 GitHub

执行以下命令显示公钥内容:

cat /c/Users/XXX/.ssh/id_rsa.pub

输出类似如下内容(以 ssh-rsa 开头):

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC7... your_email@example.com

完整复制输出内容,在 GitHub SSH Keys 设置页面 中添加新密钥。

点击New Key,填写Title,将复制的内容粘贴进 Key 文本框,最后点击 Add SSH key。

1.4 测试 SSH 连接

运行以下命令测试是否成功连接 GitHub:

ssh -T git@github.com

如果返回如下提示,则表示 SSH 已配置成功:

Hi username! You've successfully authenticated, but GitHub does not provide shell access.

如果提示主机指纹未知,请确认是否为官方服务器,并输入 yes 继续连接。

当第一次尝试连接 GitHub 的 SSH 服务,系统为了安全起见会提示你确认 GitHub 的主机密钥指纹:

The authenticity of host 'github.com (20.205.243.166)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

输入yes即可。

然后会提示你输入 passphrase(如果你在生成密钥时设置了密码),否则直接回车即可。

1.5 修改远程仓库地址为 SSH 格式

如果之前用的是 HTTPS 地址,需要改成 SSH:

git remote set-url origin git@github.com:username/repo.git

验证当前远程地址:

git remote -v

接着就能进行clone或push等操作了。

2 远程仓库推送失败问题解决

2.1 报错信息示例

我在执行推送命令时报错:

error: failed to push some refs to 'github.com:username/repo.git'
hint: Updates were rejected because the remote contains work that you do not have locally.

2.2 原因分析

该错误通常表示远程分支存在本地没有的提交记录(unrelated histories) ,可能原因分析如下:

  1. 其他开发者在 GitHub 上向 main 分支提交并推送了新的代码;
  2. 你在其他设备上提交过代码但没同步回来;
  3. 远程仓库初始化时已包含文件(如 README.md)。

此时 Git 无法直接合并两个不同历史起点的分支。

我的例子是我在本地初始化了一个新的 Git 仓库(git init),接着添加了远程仓库地址;
然后我执行 git pull origin;
main 想要拉取远程分支内容; 但由于本地和远程是完全独立的仓库(没有任何共同提交历史),Git 默认拒绝合并它们。

2.3 解决方法:拉取远程并合并不相关历史

2.3.1 允许合并不相关历史

git pull origin main --allow-unrelated-histories

此参数用于强制 Git 合并两个没有共同祖先的提交历史。

2.3.2 解决冲突(如有)

如果提示冲突,检查状态并处理冲突:

git status

添加文件并提交:

git add .
git commit -m "合并远程仓库到本地"

2.3.3 推送至远程

git push origin main

到此这篇关于使用SSH协议解决Git推送失败问题的具体操作方法的文章就介绍到这了,更多相关SSH协议解决Git推送失败内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Git分布式版本控制工具使用详解

    Git分布式版本控制工具使用详解

    这篇文章介绍了Git的基本概念、安装与配置、基本操作、在运维中的应用以及常见问题的解决方法,Git是一个强大的分布式版本控制系统,广泛应用于软件开发和运维领域
    2025-12-12
  • postman测试接口各种类型传值的实现

    postman测试接口各种类型传值的实现

    本文主要介绍了postman测试接口各种类型传值的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 代码中到底应不应当写注释?

    代码中到底应不应当写注释?

    注释的确有其用途,但大部分情况下,程序员在滥用注释。我是反对夹杂在代码间的注释的,我认为注释应当从代码中独立出来——通常被称为文档。
    2014-10-10
  • Git的使用规范流程总结

    Git的使用规范流程总结

    大家都明白在团队开发中,遵循一个合理、清晰的Git使用流程,是非常重要的。否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。所以这篇文章给大家分享了Git的使用规范流程,有需要的可以参考借鉴。
    2016-09-09
  • Git通过配置SSH密钥对实现免登录的完整指南

    Git通过配置SSH密钥对实现免登录的完整指南

    在使用 Git 进行版本控制时,每次推送代码都需要输入用户名和密码会严重影响工作效率,通过配置 SSH 密钥对,可以实现免密码认证,让 Git 操作更加便捷安全,下面小编为大家详细介绍一下,需要的朋友可以参考下
    2025-11-11
  • Git子模块拉取操作的完整指南

    Git子模块拉取操作的完整指南

    子模块(Submodule)允许将外部 Git 仓库嵌入到当前项目中,常用于管理第三方库、共享代码模块等场景,子模块指向特定提交,保持主仓库与子模块的独立版本控制,本文给大家介绍了Git子模块拉取操作的完整指南,需要的朋友可以参考下
    2025-11-11
  • 详谈git 提交代码步骤,干货

    详谈git 提交代码步骤,干货

    这篇文章主要介绍了详谈git 提交代码步骤。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • gitlab项目实现添加新成员

    gitlab项目实现添加新成员

    这篇文章主要介绍了gitlab项目实现添加新成员方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-11-11
  • 编程之显示/隐式声明

    编程之显示/隐式声明

    显示声明 是程序中的一条说明语句,它列出一批变量名并指明这些变量的类型。隐式声明 指通过某种默认协定的方法将变量名与类型绑定。
    2011-01-01
  • VScode 隐藏大量无用的文件比如在看Linux kernel或boot时候

    VScode 隐藏大量无用的文件比如在看Linux kernel或boot时候

    这篇文章主要介绍了VScode 隐藏大量无用的文件比如在看Linux kernel或boot时候,VScode 工程创建先在 Ubuntu 下编译一下 uboot,然后将编译后的 uboot 文件夹复制到 windows 下,并创建VScode 工程,需要的朋友可以参考下
    2022-10-10

最新评论