当前位置: 首页 > news >正文

【git使用场景】本地仓库与远程仓库存在独立历史

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、本地仓库关联远程仓库
    • 1. 先查看本地是否已有远程关联(可选)
    • 2. 关联远程仓库
    • 3. 验证关联是否成功
  • 二、设置上游分支
    • 1. git pull
      • 错误原因
      • 解决方案
      • 自动设置上游分支(可选)
    • 2. git push -u origin master
  • 三、拉取远程仓库
    • 1. git pull
    • 2. git pull origin master
  • 总结


前言

现有一个本地仓库,里面有若干次提交,想要将这个仓库上传到远程仓库,现在能想到的几个方法:

  • 1.git clone远程仓库到本地,然后把本地仓库的文件拷贝到这个clone的本地git仓库,上传远程仓库
  • 2.本地仓库关联远程仓库后直接上传

第一种是个笨方法,而且无法保留之前本地仓库的历史版本,不推荐不介绍

第二种方法应该是正常使用的方法,但有几个注意点:

  • 1.本地仓库分支与远程仓库分支一致,且远程仓库为空仓库;最理想状态,本地仓库关联远程仓库后直接推送即可。
  • 2.本地仓库分支与远程仓库分支一致,但远程仓库不为空,如有readme文件;使用时有注意点,本文介绍。
  • 3.本地仓库分支与远程仓库分支不一致,后面再写一篇介绍。

提示:以下是本篇文章正文内容,下面案例可供参考

一、本地仓库关联远程仓库

本地仓库未关联远程仓库时,执行git push会报下面错误:

fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using

git remote add <name> <url>

and then push using the remote name

git push <name>

这个错误提示说明你的Git仓库还没有配置推送目标(远程仓库)。解决方法很简单,你需要先配置一个远程仓库,然后再执行推送操作。

确保你已经在远程代码托管平台(如GitHub)上创建了对应的仓库,并且拥有推送权限。将本地仓库与远程仓库关联的步骤如下:

1. 先查看本地是否已有远程关联(可选)

git remote -v

如果已有关联,会显示远程仓库的信息;如果没有任何输出,说明尚未关联任何远程仓库。

2. 关联远程仓库

使用 git remote add 命令关联,语法:

git remote add <远程仓库别名> <远程仓库URL>

这里的远程仓库URL可以是GitHub、GitLab、Gitee等平台上创建的仓库地址。

示例:
假设远程仓库地址是 https://gitee.com/abc/xyz.git,通常我们用 origin 作为默认别名:

git remote add origin https://gitee.com/abc/xyz.git

3. 验证关联是否成功

再次执行 git remote -v,如果看到类似以下输出,说明关联成功:

origin  https://gitee.com/abc/xyz.git (fetch)
origin  https://gitee.com/abc/xyz.git (push)

二、设置上游分支

1. git pull

关联远程分支后,如果直接选择git push推送,会报下面这个错误:

fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

git push --set-upstream origin master

To have this happen automatically for branches without a tracking
upstream, see ‘push.autoSetupRemote’ in ‘git help config’.

这个错误提示表明本地的master分支没有关联到远程仓库的对应分支。Git需要知道将本地分支推送到远程的哪个分支,因此你需要显式设置上游分支。

错误原因

当你执行git push时,如果本地分支没有设置对应的远程跟踪分支,Git就会抛出这个错误。这通常发生在以下情况:

  • 你创建了一个新的本地分支并首次推送。
  • 你重命名了本地分支(如之前的git branch -M main操作)。
  • 远程分支被删除后重新创建。

解决方案

执行Git提示的命令,设置上游分支并推送:

git push --set-upstream origin main

这个命令等价于:

git push -u origin main

其中:

  • -u(或--set-upstream)参数将本地的main分支与远程仓库的main分支关联。
  • 之后你就可以直接使用git pushgit pull,无需再指定远程分支。

自动设置上游分支(可选)

如果你希望Git自动为新分支设置上游,可以配置push.autoSetupRemote

git config --global push.autoSetupRemote true

这样,每次使用git push推送新分支时,Git会自动创建并关联远程分支。

2. git push -u origin master

上面提到,本地仓库分支没有关联远程仓库分支时,使用git push是会报错的,应该使用
git push -u origin main
但是再本文章中这种 本地仓库与远程仓库存在独立历史情况下会报

To https://gitee.com/abc/xyz.git
! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://gitee.com/abc/xyz.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

或者

To https://gitee.com/abc/xyz.git! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://gitee.com/abc/xyz.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

这个错误提示表明你的本地分支落后于远程仓库的对应分支,导致推送失败。这通常是因为远程仓库有你本地没有的更新。

解决方法:拉取远程仓库的更新并合并到本地分支:

三、拉取远程仓库

1. git pull

执行git pull会报下面的错误:

There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

git branch --set-upstream-to=origin/<branch> master

这个错误提示表明当前分支没有设置与远程分支的跟踪关系,因此 Git 不知道应该从哪个远程分支拉取更新。

解决方法很简单,你需要先为本地分支设置远程跟踪分支,然后再进行拉取操作:

  1. 首先设置本地 master 分支跟踪远程 origin/master 分支:
git branch --set-upstream-to=origin/master master
  1. 然后就可以正常拉取远程更新了:
git pull

之后你再执行 git push 时,Git 就会知道要推送到哪个远程分支,不需要每次都指定 origin master 了。

如果你想直接拉取而不先设置跟踪关系,也可以在拉取时明确指定远程和分支:

git pull origin master

2. git pull origin master

执行git pull origin master会报下面的错误:

From https://gitee.com/abc/xyz

  • branch master -> FETCH_HEAD
    fatal: refusing to merge unrelated histories

这个错误发生在 Git 拒绝合并两个被认为是"不相关"的历史记录的分支。这通常发生在以下情况:

  • 本地仓库是全新创建的,而远程仓库已有提交历史
  • 两个仓库完全独立创建,没有共同的提交历史

解决方法是在拉取时添加 --allow-unrelated-histories 参数,允许 Git 合并不相关的历史:

git pull origin master --allow-unrel++ated-histories

执行这个命令后,Git 会强制合并这两个分支的历史。如果出现合并冲突,你需要:

  1. 编辑冲突文件,解决冲突标记(<<<<<<<=======>>>>>>>
  2. 标记为已解决:git add <冲突文件>
  3. 完成合并:git commit -m "合并不相关历史并解决冲突"

之后就可以正常推送了:

git push origin master

这个参数只需要在第一次合并不相关历史时使用,后续操作不需要再添加。


总结

本文所述的这种本地仓库与远程仓库存在独立历史情况下,采用下面处理方式:

  • 1.git remote add origin
  • 2.git pull origin master --allow-unrelated-histories
  • 3.git push origin master

1关联本地仓库与远程仓库
2强制合并两个独立分支,也是最关键的一步
3推送本地仓库到远程仓库

总之,所有问题在于,当两个仓库有独立历史时,
直接推送本地仓库本身就不合理,自然会报错本地仓库落后于远程仓库
此时选择拉取远程仓库又会报错两个仓库不相关
所以重点是git pull origin master --allow-unrelated-histories强制让两个仓库一致,问题就解决了

另外说一嘴

使用git push -u origin master之后,后续就可以直接git pullgit push了,效果和
git branch --set-upstream-to=origin/master master一样,不然以后都要一直用
git push origin master

http://www.xdnf.cn/news/1366885.html

相关文章:

  • ​Visual Studio + UE5 进行游戏开发的常见故障问题解决
  • 系统开发 Day4
  • 音视频学习(五十六):单RTP包模式和FU-A分片模式
  • Linux驱动开发笔记(七)——并发与竞争(上)——原子操作
  • 深度学习-----《PyTorch深度学习核心应用解析:从环境搭建到模型优化的完整实践指南》
  • 链表OJ习题(2)
  • 操作系统中,进程与线程的定义与区别
  • 似然函数对数似然函数负对数似然函数
  • Ant Design for UI 选择下拉框
  • BIO、NIO 和 AIO
  • 2025.8.25回溯算法-集合
  • Typora + PicList + Gitee 图床完整配置教程
  • 【ElasticSearch】json查询语法和可用的客户端
  • ESP32开发WSL_VSCODE环境搭建
  • Mysql系列--8、索引
  • Java延迟任务实现方案详解:从DelayQueue到实际应用
  • 2.3零基础玩转uni-app轮播图:从入门到精通 (咸虾米总结)
  • 【Docker基础】Docker-compose进阶配置:健康检查与服务就绪
  • K8s Pod驱逐机制详解与实战
  • C++ extern 关键字面试深度解析
  • 开源 C++ QT Widget 开发(六)通讯--TCP调试
  • 安全合规:AC(上网行为安全)--下
  • vue 一键打包上传
  • Genymotion 虚拟机如何安装 APK?(ARM 插件安装教程)
  • ICCV 2025|TRACE:无需标注,用3D高斯直接学习物理参数,从视频“预知”未来!
  • 二、添加3D形状
  • More Effective C++ 条款07:不要重载、和,操作符
  • 【系统架构设计师】数据库设计(一):数据库技术的发展、数据模型、数据库管理系统、数据库三级模式
  • 审核问题——首次进入APP展示隐私政策弹窗
  • 大模型(一)什么是 MCP?如何使用 Charry Studio 集成 MCP?