Git基本工作流

Git基本工作流,git,push,Git,Push,可能重复: 我是Git新手,正在尝试将其用于本地grails项目。 我遵循的步骤是: 创建grails项目 转到项目目录并git init 在临时区域添加项目中的所有文件并提交 回购协议中的git状态给出以下消息 BXX@BXX-PC /c/Work/Grails/projects/yyy/tables (master) $ git status # On branch master nothing to commit (working directory clean) 尝试将其保留为主分

可能重复:

我是Git新手,正在尝试将其用于本地grails项目。
我遵循的步骤是:

  • 创建grails项目
  • 转到项目目录并
    git init
  • 在临时区域添加项目中的所有文件并提交
  • 回购协议中的git状态给出以下消息

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

  • 在我的IDE中,签出项目(IntelliJ)。这实际上是将项目克隆到另一个目录
  • 进行更改并提交项目
  • 将本地更改推送到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. 
    
  • 克隆的回购状态为

    $ git status
    # On branch master
    # Your branch is ahead of 'origin/master' by 1 commit.
    #
    nothing to commit (working directory clean)
    
    请帮助我理解这一点。是否有更好的工作流程可以遵循。我可以通过Intellij初始化回购协议,并尝试处理主分支。仍然不确定上面出了什么问题


    多谢各位

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

    实现这一点的最佳方法是推送到一个裸存储库,该存储库是在创建repo时通过向Git传递
    --bare
    标志创建的:

    $ mkdir new_repo
    $ cd new_repo
    $ git --bare init
    
    当然,裸回购协议不会签出任何文件,因此您无法实际使用它(您必须先克隆它)


    如果您只是使用Git repo进行本地开发(而不是共享或服务Git repo),则不必推送远程repo;您可以处理本地非裸回购的单个副本。

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

    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分支的新代码合并到development分支中

    因为在将来的某个时候,当您决定开发分支中的代码获得某个里程碑时,您可以合并从开发分支的所有更改

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

    我现在给你的建议是:阅读更多关于git、分支和隐藏的内容(对于快速修复非常有用)。一段时间后,您将从使用git中获得巨大的努力


    祝你好运。

    这是对成功的git工作流最清晰、最全面的描述。它基本上涵盖了谢尔盖的建议,并添加了一些非常简洁的图形


    作者还建议在合并时包含
    --no ff
    标记,以记录您在历史上有一个功能分支的事实。

    我在尝试解决相同类型的问题时结束了这里,幸运的是有一个更好的答案:

    你应该去看看那个。尤其是在这种情况下很容易结束。对我来说,我所做的只是创建一个目录,然后git初始化它,以创建新的“共享存储库”。这是一个USB密钥,因为我们的网络被完全锁定,我们还不能共享目录或访问GitHub

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


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

    非常感谢您的详细回复。。事实上,我读了你们关于类似问题的一些答案。我可能会按照你的建议使用一个本地回购,然后在必要时克隆。不过,我是否有可能签入(提交)第一个(主)repo,然后尝试推送克隆的repo。我很好奇,有人怎么能克隆我的回购协议,并在后期将其推给主人。我非常感谢你的评论,所以从长远来看我不后悔。。感谢againNote:有一种情况下,推动非裸回购是合适的:非常感谢您的逐步回答。。你完全正确,我仍然认为传统的SCM