Ruby on Rails - Git Branch Workflow

时间:2016-02-12 16:30:24

标签: ruby-on-rails ruby git github

我知道它是一个简单的概念,但在研究了几个网站后却没有把握它。

我有一个Ruby On Rails项目并使用git来管理源代码。我有一个生产准备好的快照并初始化git,使它有一个master(使用git init,git add -A和git commit -m)。

现在我想尝试一个新功能,所以我创建了一个名为'test'的分支,使用git checkout -b test

现在,在测试中我尝试使用rails g scaffold UserToken username:string

的新脚手架

Scaffold创建了所有ROR文件,我做了一个rake db:migrate来更新数据库。然后我进入rails控制台并测试向db添加记录,然后开始更新其他生成的scaffold模型文件。

午饭后,我回来决定要废弃所有这些。

问题 - (在我自己尝试之后)回到主人的唯一方法是git add -A,git commit -m然后git checkout master?我是否真的需要添加并承诺重新掌握? (这确实有效;但是我不认为我正在抓住git中基本的东西,我会做一些我要废弃的东西)

接下来,如果我做上述事情(我不认为这是正确的)当我回到主人时,我确实看到我的脚手架文件已经消失,因为迁移文件(创建表)和模式。 rb反映了在分支中生成的表不存在。

到目前为止一切顺利:

但是,如果我进入实际的数据库,表IS仍然存在。我在ROR / Git中错过了在分支中测试某些内容然后放弃它的基本原理吗?

更新#1

所以Stash似乎没有帮助: Stash无济于事。

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中,但是所有的脚手架文件仍然存在(并且不应该)

2 个答案:

答案 0 :(得分:4)

这里有两个问题:

首先:如何在不提交正在进行的工作的情况下在分支机构之间移动?

要在分支之间移动而不必提交您的工作,您可以使用model.sel(lapply(dredge(..., evaluate = FALSE), eval), ...)

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分支。未跟踪尚未添加到git add的文件(包括创建)的更改。因此它们就像通用文件系统的任何其他部分一样,并且将在分支中保持可见。

第二:为什么一个分支中的数据库迁移更改会显示在另一个分支中?

因为数据库管理器不是git的一部分。无论您修改哪些DBMS,这些更改都会通过DBMS保留。如果要将分支迁移分开,则需要为每个迁移分别设置一个数据库实例。

如果将git分支想象为文件系统模板,可能会有所帮助。当您切换到另一个分支时,该分支的模板将使用其控制下的任何内容覆盖您现有的文件系统。其他一切都被忽略了。提交时,您正在更新该分支的模板。但是,您的所有工作实际上都是在一个真正的文件系统中完成的。

这意味着您对git控件之外的文件系统所做的事情仍然可以在所有分支中看到。

答案 1 :(得分:1)

git reset --hard HEAD会删除所有内容,然后返回测试分支,以便您可以轻松切换回git checkout master

rake db:reset应该使用数据库中的数据

更新:

如果你真的想摆脱任何事情:

git reset --hard && git clean -dfx rake db:drop rake db:create && rake db:migrate