Git如何通过远程仓库/本地仓库推送和拉动?

时间:2012-07-11 13:58:49

标签: git

我来自SVN,我不明白整个Git是如何运作的。我已经创建了一个远程仓库,在我的本地机器上克隆了仓库 - 如果我对本地机器中的文件进行更改并尝试将这些文件推送到我克隆的确切远程仓库,我会收到这样的错误。 / p>

remote:错误:拒绝更新签出的分支:refs / heads / master

我浏览了一些关于同一问题的SO问题,最流行的解决方案是创建一个裸存储库然后承诺。那么当我从新的回购中克隆时会发生什么 - 这会再次发生吗?我应该继续为我当地的每次提交创建新的裸仓吗?我很困惑,如果有人能指出我正确的方向,那将会很棒。 我想我完全错了。

我遵循的确切步骤: 1)在远程服务器中创建一个目录 - init作为git repo 2)将我需要的所有内容复制到服务器中 3)将内容添加到git并在那里提交 4)将git repo从远程克隆到我的本地机器 5)对我本地的文件进行了更改,将更改添加到我的本地并提交了它。 6)当我尝试使用:git push origin将我本地的更改推送到远程时    我收到错误消息。我在下面提供了整个错误消息。

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: Auto packing the repository for optimum performance.

remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
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 some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
 ! [remote rejected] master -> master (branch is currently checked out)

2 个答案:

答案 0 :(得分:2)

裸露的回购是您通常应该进入的唯一的回购,因为非裸回购意味着有签出的文件的副本需要更新。如果您有两个您控制的存储库,并且您希望它们都已检出数据副本,则使用两个位置的git pull从相反的位置拉出。一方面你可以做一个克隆,但另一方面你必须使用git remote add才能创建一个遥控器。

一个简单的回购会让你进入它,因为你知道你并没有弄乱一个签出副本的中间做某事的想法。

如果您还没有阅读过“gittutorial”的手册页,我会从那里开始,因为它们是开始学习的好地方。

至于一个好的工作模式,我经常有一台(服务器)机器,其中有一个裸仓库,并且通常在多个其他机器上复制该仓库包括服务器本身。因此,如果我正在处理服务器上的repo,我不会使用裸仓库(显然),我克隆它并在其他地方工作并推入它。这让每个克隆进入“主”裸仓库并从中拉出。它使同步更容易,特别是当某些副本不总是在线时。

注意:没有“错误方式”或“最佳方式”。每个人都有自己处理存储库的首选方式。这是分布式存储库系统(git或其他)的更好部分之一:它让每个用户都能做最适合自己的事情。

答案 1 :(得分:2)

共享/远程存储库使用裸格式,这意味着它们没有工作副本。 Subversion是相同的 - 中央存储库没有工作副本。工作副本是通过subversion中的签出和git中的克隆创建的。

如果将远程存储库更改为裸格式,则不会继续出现此问题。

工作流程与subversion没有显着差异,只是一个额外的步骤(或两个,取决于您使用的命令)

Make changes
git add (to add the changes to the staging area)
git commit (to save the changes to the local repo)
git push (to push the changes to the remote repo)

如果要从远程仓库中提取其他人的更改,则执行“git pull”,其功能类似于“svn update”。