【问题标题】:Ruby on Rails - Git Branch WorkflowRuby on Rails - Git 分支工作流程
【发布时间】:2016-05-23 21:32:33
【问题描述】:

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

我有一个 Ruby On Rails 项目并使用 git 来管理源代码。我有一个生产就绪快照并初始化 git,使其具有一个 master(使用 git init、git add -A 和 git commit -m)。

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

现在在测试中,我用 rails g scaffold UserToken username:string 尝试了一个新的脚手架

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

午饭后我回来后决定放弃这一切。

问题 - (在我自己尝试过之后)是回到 master 的唯一方法是 git add -A, git commit -m 然后 git checkout master ?我真的必须添加并承诺才能回到主人身上吗? (这确实有效;但是我认为我没有掌握 git 中的一些基本知识,我会提交一些我将要废弃的东西)

接下来,如果我执行上述操作(我再次认为这是不对的),当我回到 master 时,我确实看到我的脚手架文件以及迁移文件(它创建了表)和架构都消失了。 rb 反映在分支中生成的表不存在。

到目前为止一切顺利:

但是,如果我进入实际数据库,表仍然存在。我在 ROR/Git 中缺少什么基本原理,即在分支中测试某些东西然后放弃它?

更新 #1

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

【问题讨论】:

  • 我想你在搜索git checkout master -f
  • @ndn 我尝试了 git checkout master -f。我在分支中创建的文件仍然可见并且不应该是正确的?
  • git stash 对您不起作用的原因是因为新文件尚未在 git 控制之下。直到通过git add 告知git 一个文件,它只是一个文件系统人工制品。它还不是任何git 分支的一部分,因此不能被git 操作。
  • 谢谢詹姆斯;是的,我想我已经知道添加必须发生。我原以为 git 可以让我设置一个“master”,然后尝试一堆东西,然后简单地放弃“try”并回到 master,而不必“跟踪 - 添加 - 提交”刚刚没有的东西到 git'甚至不需要成为“历史”的一部分。
  • 您可以消除 git 中的死胡同历史,但这也涉及重写在其他分支中所做的所有提交。这不是特别困难,特别是对于一个小项目,但我从来没有发现它值得。您的项目历史包括死胡同,如果它们位于废弃的分支中,您将永远看不到它们。存储空间并不是 git 真正关心的问题,除非您向不再需要的分支添加了一些非常大的文件。但是,您确实需要不时运行git gc 来整理并减少空间消耗。

标签: ruby-on-rails ruby git github


【解决方案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

【讨论】:

  • 查看我上面的更新,也尝试了这个,但是在 rake db:reset 之后我仍然在数据库中有表。
  • 你也可以rake db:drop然后rake db:create && rake db:migrate来取消任何提醒。但最终,额外的表或列对开发环境来说应该不会太糟糕,并且足以不时地这样做。
  • 谢谢,这似乎是诀窍。我刚刚做了 rails destroy 脚手架,然后添加、提交和签出回到 master,然后 drop、delete 和 migrate 似乎一切都回到了原来的位置谢谢!
【解决方案2】:

你有两个问题:

第一:如何在不提交正在进行的工作的情况下在分支之间移动?

要在分支之间移动而不必提交您的工作,您可以使用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 控制的事情在所有分支中仍然可见。

【讨论】:

  • 虽然接受的答案解决了用户的“如何?”问题,这回答了“为什么?” 。
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多