0


【git踩坑记录】git push时本地分支名与远程仓库分支名不一致引发的问题

前言

我在github上新创建的远程仓库默认分支名为main,而本地仓库默认分支名为master,当我push代码的时候碰到了若干坑…


一、踩坑一:奇怪的上游分支?

先在github上快速创建个仓库,有个readme文件,远程仓库分支是main分支
在这里插入图片描述
然后本地创建两个文件夹,假装是两台主机,我们先在张三文件夹里写点东西
在这里插入图片描述
在张三的文件夹里创建文本并提交到了本地仓库,且现在与远程仓库建立了连接,当我们现在想要把本地仓库push到远程,直接git push?
在这里插入图片描述

发现报错,

fatal:the current branch master has no upstream branch

,表示当前本地分支master没有上游分支,要想push当前分支并设置远程分支为上游分支,用以下指令。
在这里插入图片描述

我们先试试此指令给本地master设置上游分支

git push --set-upstream origin master

在这里插入图片描述
登录之后,push成功,但是是给远程创建了新的master分支,将origin/master设置为本地master的上游分支,这显然不是我们想要的结果
在这里插入图片描述
因为我们将上游分支设为了origin master,所以会在远程新创建一个master分支。那想要把本地master推到远程main,应该如何操作?

二、踩坑二:合并报错unrelated history

我们再来到李四的文件夹进行尝试,还是先快速搭建一下本地git仓库
在这里插入图片描述
我们尝试拉取远程main分支里的readme文档,发现报错

fatal:refusing to merge unrelated histories

。表示拒绝合并两个毫不相关的分支,我们都知道git pull = git fetch + git merge,所以把git pull进行拆分,发现可以正常fetch到远程仓库的代码,但是拒绝合并,这又是为什么呢?
在这里插入图片描述
在stack overflow查询得知,这个问题是在git 2.9版本后产生。因为在这之前git merge允许合并两个毫不相干的分支(两个分支都有过提交历史,但没有共同父节点则被认为是不相关),这可能会让一些小白犯错。所以在git 2.9版本后不允许这一默认行为。如果非要合并,可以加上

--allow-unrelated-histories

强制合并
在这里插入图片描述
强制merge成功,可以看到readme文档成功拉下来。此时要想push本地master代码到远程main,又该如何操作呢?
在这里插入图片描述

三、胜利的曙光:分支名不一致push终极解决办法

直接push依然错误,提示需要设置上游分支。通过

git branch ---set-upstream-to=origin/main

指令,将本地master分支的上游分支设置为远程main分之后,再次push,依然报错。提示需要更详细指定的push指令:

git push origin HEAD:main

/

git push origin master:main

在这里插入图片描述
可以看到,用更详细的指令终于push成功了,但每次都需要这样写太繁琐了,而且已经将本地master的上游分支设置为了origin/main,有没有更好的解决办法呢?
在这里插入图片描述

通过查阅git文档,发现这一机制是因为push.default这一配置的默认行为
输入git push,如果当前配置为:

  • current push当前分支到远程相同名字的分支,如果远程没有这个名字的分支,则会在远程创建相同名字的新分支
  • upstream push到当前分支的上游分支
  • simple push当前分支到远程相同名字的分支,u如果远程没有这个名字的分支,会报错而不会创建新远程分支(在git 2.9版本后,simple是默认行为)在这里插入图片描述

所以我们得知,如果**想让git push自动push到匹配的上游分支,则需要修改git config,通过

git config push.default upstream

修改这一默认行为**。
在这里插入图片描述

我们再对李四的文件进行一些修改,并提交到本地仓库,再次尝试push到远程
在这里插入图片描述

成功!

四、总结

可以看到,分支名不一致时,需要先给当前分支设置远程分支为上游分支。push时需要严格按照

git push <remote> <local branch> : <remote branch>

格式,否则会报错
但是每次都写这么长串很麻烦,可以通过

git config push.default upstream

指令,修改push的默认行为,自动push到已经配对的上游分支,以后就可以直接

git push

提交代码。
但最好还是一开始就保持分支名一致hhh

标签: git github

本文转载自: https://blog.csdn.net/FloriaLiii/article/details/129098316
版权归原作者 浅夏、 所有, 如有侵权,请联系我们删除。

“【git踩坑记录】git push时本地分支名与远程仓库分支名不一致引发的问题”的评论:

还没有评论