草庐IT

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

浅夏、 2024-04-24 原文

前言

我在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踩坑记录】git push时本地分支名与远程仓库分支名不一致引发的问题的更多相关文章

  1. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  2. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  3. ruby-on-rails - Capybara-webkit 引发 Capybara::Driver::Webkit::WebkitInvalidResponseError - 2

    我在rspec中收到来自webkit驱动程序的以下消息:Capybara::Driver::Webkit::WebkitInvalidResponseError:UnabletoloadURL:http://127.0.0.1:44923/posts几天前它成功了。问题出在save_page方法上。有什么问题吗? 最佳答案 当我的页面出现错误时,我收到过类似的错误消息。您应该通过在测试模式下启动服务器(railss-etest)并自行访问页面来手动检查情况是否如此。 关于ruby-on-

  4. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  5. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  6. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  7. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

  8. ruby-on-rails - 在 Rails 中更高效地查找或创建多条记录 - 2

    我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr

  9. ruby - 在模块/类之间共享全局记录器 - 2

    在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

  10. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

随机推荐