【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 push
或git 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 不知道应该从哪个远程分支拉取更新。
解决方法很简单,你需要先为本地分支设置远程跟踪分支,然后再进行拉取操作:
- 首先设置本地
master
分支跟踪远程origin/master
分支:
git branch --set-upstream-to=origin/master master
- 然后就可以正常拉取远程更新了:
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 会强制合并这两个分支的历史。如果出现合并冲突,你需要:
- 编辑冲突文件,解决冲突标记(
<<<<<<<
、=======
、>>>>>>>
) - 标记为已解决:
git add <冲突文件>
- 完成合并:
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 pull
、git push
了,效果和
git branch --set-upstream-to=origin/master master
一样,不然以后都要一直用
git push origin master
了