前言
我在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到远程成功!
文章来源:https://www.toymoban.com/news/detail-452527.html
四、总结
可以看到,分支名不一致时,需要先给当前分支设置远程分支为上游分支。push时需要严格按照
git push <remote> <local branch> : <remote branch>
格式,否则会报错
但是每次都写这么长串很麻烦,可以通过git config push.default upstream
指令,修改push的默认行为,自动push到已经配对的上游分支,以后就可以直接git push
提交代码。
但最好还是一开始就保持分支名一致hhh文章来源地址https://www.toymoban.com/news/detail-452527.html
到了这里,关于【git踩坑记录】git push时本地分支名与远程仓库分支名不一致引发的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!