前言
我在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
版权归原作者 浅夏、 所有, 如有侵权,请联系我们删除。