Git分支工作流程
我知道它是一个简单的概念,但在研究了几个网站之后却没有把握它。
我有一个Ruby On Rails项目并使用git来管理源代码。 我有一个生产就绪快照并初始化git,使它拥有一个主(使用git init,git add -A和git commit -m)。
现在我想尝试一个新功能,所以我使用git checkout -b test创建了一个名为'test'的分支
现在,在测试中,我尝试使用rails g scaffold UserToken username:string的新脚手架
脚手架创建了所有的ROR文件,我做了一个rake数据库:迁移来更新数据库。 然后我进入rails控制台并测试将记录添加到数据库,然后开始更新其他生成的脚手架模型文件。
午餐后,我回来决定要废除所有这一切。
问题 - (自己尝试后)是回到主要的唯一方法是git添加-A,git commit -m然后git checkout master? 我真的必须添加并承诺回到主人身边吗? (这确实有效;但是我不认为我在git中掌握了一些基本的东西,我会对我将要废弃的东西做一个提交)
接下来,如果我做了上述(再次我不认为这是正确的),当我回到主人的时候,我发现我的脚手架文件已经消失,迁移文件(创建表)和schema.rb反映了在分支中生成的表不存在。
到现在为止还挺好:
但是,如果我进入实际的数据库,表格仍然存在。 ROR / Git在分支中测试某些东西然后放弃它时缺少什么基本的基础知识?
更新#1
所以藏匿似乎没有帮助:藏匿不起作用。
Steps:
rails new test_app
git init
git add -A
git commit -m 'initial commit'
git checkout -b newfeatures
rails g scaffold UserToken username:string coin:integer
files get generated...
sqlite3 db/development.sqlite3 show that there is now a table called user_tokens:
git stash save
git checkout master
现在,在Master中,所有脚手架文件仍然存在(而且不应该)
git reset --hard HEAD
删除了所有内容,并返回到testbranch的头部,以便使用git checkout master
轻松切换回去
rake db:reset
应该在数据库中处理你的数据
更新:
如果你真的想摆脱任何东西:
git reset --hard && git clean -dfx rake db:drop rake db:create && rake db:migrate
这里有两个问题:
第一:如何在不进行工作的情况下在分支机构之间移动?
要在分支之间移动而不必提交你的工作,你可以使用git stash
。
git stash help
Usage: git stash list [<options>]
or: git stash show [<stash>]
or: git stash drop [-q|--quiet] [<stash>]
or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
or: git stash branch <branchname> [<stash>]
or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet] [<message>]]
or: git stash clear
一旦你藏起你的工作,那么你可以在没有问题的分支之间切换。 请注意,您希望存储的文件必须首先通过git add
添加到git
分支。 不会跟踪尚未添加到git
中的文件(包括创建)的更改。 所以它们就像通用文件系统的其他部分一样,并且在分支机构中保持可见。
第二:为什么我的数据库迁移变化在另一个分支中出现?
因为数据库管理器不是git
一部分。 无论您正在修改这些更改的DBMS都通过DBMS持久保存。 如果你想保持你的分支迁移分离,那么你需要为每个分支都有一个单独的数据库实例。
如果你想象一个git
分支作为文件系统模板,这可能会有所帮助。 当你切换到另一个分支时,那个分支的模板就会用你控制的任何东西覆盖你现有的文件系统。 其他一切都被忽略。 提交时,您正在更新该分支的模板。 但是,您的所有工作实际上都是在一个真正的文件系统中完成的。
这意味着你对git
控制之外的文件系统所做的事情在所有分支中都是可见的。
上一篇: Git Branch Workflow