将代码推送到远程主分支

3

我有一个远程的和本地的git仓库。
本地仓库是从远程克隆而来的。
当我修改了本地仓库并提交到主分支时,
然后运行"git push"到远程仓库时,
但失败了并输出以下信息。

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable t
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing int
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in som
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, se
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

我在远程代码库中使用了 "git checkout -b current" 命令创建了另一个分支。
接着在本地代码库中,我运行了 "git push" 命令并且成功了。
但是我发现本地修改只被推送到了远程主分支。
因此我需要在远程代码库中运行 "git merge master" 命令来应用更改。

我是 Git 的新手。
我做错了什么吗?


请参考以下链接解决git push失败的问题:https://dev59.com/iGXWa4cB1Zd3GeqPReQj,https://dev59.com/uWgu5IYBdhLWcg3wuJWF,https://dev59.com/tmox5IYBdhLWcg3ww3CV。 - eckes
3个回答

7
远程仓库不是裸仓库,并且已经检出了master分支。默认情况下,Git不允许您将内容推送到非裸存储库的当前分支。
理想情况下,您应该将接收推送的远程存储库设置为裸存储库(git init --bare)。

我的现有代码库可以设置为裸库(git init --bare)吗? - Magic
我不这么认为,但如果它是一个基于Linux的主机,并且你的仓库名为“foo”,那么只需要像这样简单的步骤:mv foo foo2mkdir foocd foogit init --baregit remote add origin ./../foo2git pull - Dean Rather

2

manojlds'的回答是正确的,但知道你的远程仓库的目的可能会有所帮助。

  • 如果远程仓库只是用于备份/协作目的->您已经有了正确的想法,只需将远程仓库替换为“裸”仓库,然后从那里开始。
  • 如果远程仓库是生产服务器,则您正在错误地进行操作->您应该有不同的配置。

一个很好的配置是,您可以“推送到生产环境”,也就是拥有一个“裸”仓库来备份/协作,然后您有一个单独的仓库设置在部署服务器上,并从裸仓库克隆。然后,在裸仓库中,您可以放置一个“post-receive hook”,使部署仓库执行拉取操作。

我相信有指南说明如何做到这一点...我自己曾经遵循过一个 :)


1

当我刚开始使用Github时,我的导师给了我这个遵循的原则:

在本地修改代码。当提交时间到了,请执行以下操作:

  1. 执行 git pull(非常重要,以同步远程仓库的内部引用头文件到您的本地仓库)
  2. 如果不同文件中存在任何冲突,请通过打开Kdiff中的两个文件并谨慎选择您的副本或远程副本或两者混合来仔细合并它们。一旦您解决了所有冲突,就可以推送合并。
  3. 在第2步之后,执行 git push 以保存您首先想要提交的代码的本地更改。

Subversion可能很麻烦,但保持同步非常重要。这些规则帮助我很多,以使用Github来维护子版本。希望这有所帮助。


我认为这对提问者没有帮助,因为你在谈论一般性的问题而没有回答他的问题。 - eckes
1
关于你的经验法则:我认为它是错误的。当到了提交的时候,就提交吧。没有其他选择。当需要将东西回退到另一个仓库时,你需要执行像“fetch”和“rebase”、“pull”或类似的操作。然后解决冲突,最后再进行推送。在第三步中,你的本地提交将会被发送到远程仓库。而SVN可能不仅仅是个麻烦,它确实就是个麻烦。 - eckes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接