2010-04-19 99 views
26

可能重复:
git push error '[remote rejected] master -> master (branch is currently checked out)'Git的基本工作流程

我是新来的Git,并试图将它用于本地Grails项目。
步骤我跟着:

  1. 创建Grails项目
  2. 进入项目目录和git init
  3. 添加的所有文件在项目中临时区域和提交。
  4. 在回购的git的状态给出了以下消息

    [email protected] /c/Work/Grails/projects/yyy/tables (master) 
    $ git status 
    # On branch master 
    nothing to commit (working directory clean) 
    
  5. 试图保持它作为主分支,通过克隆回购进行更改,后来又推又变回。为此

  6. 在我的IDE中,签出项目(IntelliJ)。这实际上是将项目克隆到另一个目录。
  7. 进行更改并提交项目
  8. 将本地更改推送到主站。

    15:41:56.249: git push -v origin master 
    Pushing to c:/Work/Grails/projects/xxx/tables 
    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. 
    

克隆回购状态

$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 

请帮我理解这一点。是否有更好的工作流程要遵循。我可以通过Intellij初始化回购,并尝试在主分支上工作。仍然不确定上面有什么错。

谢谢。

+0

只需推入不同的分支,然后合并它:'git push origin master:foo'。 – kenorb 2015-09-30 15:32:51

回答

33

首先,你不需要克隆你的本地仓库。您可以使用分支来将开发划分到同一个存储库中。

Git是一个分布式VCS,如果您在Subversion或CVS之前有过使用经验,那么您需要改变主意。

Git非常敏捷,您可以使用不同的工作流程。克隆库是团队工作更需要的,而不是本地开发(恕我直言)。

分支是一个很好的选择。

参见。让我们设置主人您的存储库分支为生产就绪代码。让我们创建另一个分支为发展

$ git checkout -b development master 

现在你在发展分公司工作。

您可以针对每个要开发的功能使用不同的分支。这非常简单和有用。

让你想实现一些新的功能,我们想象一下,你需要创建一个新的分支:

$ git checkout -b newfeature development 

现在你可以用你的代码工作,添加文件,提交等。

接下来你需要合并新开发的功能将发展分支:

$ git add . 
$ git commit -m "My last changes for the new feature" 
$ git checkout development 
$ git merge newfeature 

现在从newfeature分支新的代码合并到发展分支。

为了在以后的某个时候,当你决定你在发展分支代码得到一些里程碑,你可以从发展分支合并所有更改。

这是一个非常基本的工作流程,它可以为许多分支机构提供帮助。

我现在建议你:阅读更多关于git,分支,存储(对于快速修复非常非常有帮助)。过了一段时间,你将会使用git获得很大的努力。

祝你好运。

+0

非常感谢您为您提供的分步答案..您绝对正确,我仍然认为传统的SCM模式。我之前只使用过ClearCase和Microsoft SourceSafe ......所以,你可以想象一下:-) ...你的回答帮助我把许多概念放在一起,读到git ..非常感谢... – bsr 2010-04-19 21:07:23

45

问题是,您尝试推送到非裸回购。非裸回购是一个有关联的工作树(即,文件实际签出到磁盘)。默认情况下,Git不会让你推到非裸回购;推到一个非裸回购只会更新Git的内部数据结构,改变工作树(磁盘上的文件),这意味着如果你回到你推回来的回购,并开始处理文件,你将在这些文件的旧版本上工作。当然,这会在您尝试提交更改时导致问题。

做到这一点,最好的办法就是推到仓库,这是一个通过传递--bare标志创建创建回购时到Git:

$ mkdir new_repo 
$ cd new_repo 
$ git --bare init 

当然,裸回购韩元没有检出任何文件,所以你实际上无法使用它(你必须先克隆它)。

如果您只是使用Git回购进行本地开发(而不是共享或提供Git回购),您不需要有一个远程回购推送;您可以在本地非裸回购的单一副本上工作。

+0

非常感谢你的详细回复..我实实在在地阅读了关于类似问题的一些答案。我可能会按照您的建议使用一个本地回购,然后在需要时克隆。不过,是否有可能我签入(提交)第一个(主)回购,然后尝试推出克隆的回购。我很好奇如何有人可以克隆我的回购,并在后期阶段推送给主。我非常感谢你的评论,所以我不会长期感到后悔。再次感谢 – bsr 2010-04-19 21:00:32

+0

注意:有一种情况下推送到非裸露的回购可以是适当的:http://stackoverflow.com/a/10731806/ 6309 – VonC 2012-05-24 05:49:04

10

这是一个成功的git工作流程的最清晰,最全面的描述。它基本涵盖了Sergey提出的建议,并增加了一些非常有用的图形。当您合并包括--no-ff标签保持的事实,你有一个历史的特性分支记录

A successful Git branching model

笔者还建议。

+0

感谢Jason .. – bsr 2010-05-10 20:12:10

3

我试图解决同样的问题时,在这里结束了,好在有一个更好的答案在那里:

Git push error '[remote rejected] master -> master (branch is currently checked out)'

你应该检查一出。尤其是因为在这种情况下很容易结束。对我来说,我所做的只是创建一个目录,然后通过git来创建我的新“共享存储库”。它在USB上,因为我们的网络完全被锁定,我们无法共享目录或访问GitHub。

然后我将我们的所有源代码复制到该目录中,添加它,提交它,然后将生成的存储库克隆到我的本地驱动器,以便现在可以将其作为我的起源。我想我以后可以让GitHub远程控制并取消共享的USB存储库。但是,我在本地驱动器上进行的首次更改并尝试推送到远程(密钥存储库),因为密钥存储库不是“裸露的”,所以向我发送了消息。所有的原始文件仍然存在。

请参阅链接到问题的评分最高的答案,看看该怎么做。要点是你在共享库中设置一个标志,以便它认为它是空的,然后删除除.git子目录之外的所有内容,然后你的推送就可以工作。

+0

感谢回答所问的问题。其他的答案充满了有用的git知识,但你的我超过了我的眼前的问题。 – 2012-05-22 08:25:33