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项目。
我遵循的步骤是:
git init
BXX@BXX-PC /c/Work/Grails/projects/yyy/tables (master)
$ git status
# On branch master
nothing to commit (working directory clean)
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