Git基本工作流程

时间:2010-04-19 20:36:22

标签: git push

  

可能重复:
  git push error '[remote rejected] master -> master (branch is currently checked out)'

我是Git的新手,并尝试将其用于当地的Grails项目 我遵循的步骤:

  1. 创建grails项目
  2. 转到项目目录git init
  3. 在暂存区域添加项目中的所有文件并提交。
  4. 回购中的git状态显示以下消息

    BXX@BXX-PC /c/Work/Grails/projects/yyy/tables (master)
    $ git status
    # On branch master
    nothing to commit (working directory clean)
    
  5. 尝试将其保留为主分支,通过克隆存储库进行更改,然后再将更改推回。为此

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

    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. 
    
  9. 克隆的回购状态为

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

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

    谢谢你。

4 个答案:

答案 0 :(得分:45)

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

执行此操作的最佳方法是推送到 bare 存储库,该存储库是在创建存储库时将--bare标志传递给Git而创建的:

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

当然,裸仓库不会检出任何文件,因此您无法实际使用它(您必须首先克隆它)。

如果您只是使用Git仓库进行本地开发(而不是共享或提供Git仓库),则 没有要远程仓库来推送;您可以处理本地非裸仓库的单个副本。

答案 1 :(得分:34)

首先,您不需要克隆本地存储库。您可以使用分支在同一存储库中划分开发。

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

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

分支机构是您的理想选择。

请参阅。让我们为您的存储库设置分支,以获得生产就绪代码。让我们为开发创建另一个分支:

$ 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 分支中的新代码已合并到开发分支中。

在将来的某个时候,如果您确定开发分支中的代码有一些里程碑,您可以将所有更改从开发合并到 master < / strong>分支。

这是一个非常基本的工作流程,对许多分支机构都有帮助。

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

祝你好运。

答案 2 :(得分:10)

这是成功的git工作流程的最清晰,最全面的描述。它基本上涵盖了谢尔盖所建议的内容,并添加了一些非常丰富的图形。

A successful Git branching model

作者还建议您在合并时添加--no-ff标记,以记录您在历史记录中有特征分支的事实。

答案 3 :(得分:3)

我在尝试解决同样的问题时最终到了这里,幸运的是有更好的答案:

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

你应该检查一下。特别是因为在这种情况下很容易结束。对我来说,我所做的就是创建一个目录并使用git init来创建我的新“共享存储库”。它位于USB密钥上,因为我们的网络完全被锁定,我们无法共享目录或访问GitHub。

然后我将所有源代码复制到该目录中,添加它,提交它,然后将生成的存储库克隆到我的本地驱动器,这样一来就是我的源。我想我以后可以使GitHub远程并取消共享的USB存储库。但是,我对本地驱动器的第一次更改并尝试推送到远程(密钥存储库)给了我消息,因为密钥存储库不是“裸”。所有的原始文件都在那里。

查看与问题相关的评价最高的答案,看看该怎么做。要点是你在共享存储库中设置了一个标志,因此它认为它是裸的,然后删除除了.git子目录之外的所有内容,然后你的推送就可以了。