Ruby on rails 如何正确处理rails模式源代码管理分支?

Ruby on rails 如何正确处理rails模式源代码管理分支?,ruby-on-rails,git,version-control,schema,Ruby On Rails,Git,Version Control,Schema,我有一个反映主分支迁移的版本化schema.rb。 每当我转到另一个分支并在该分支中运行新迁移时,我的数据库结构都会改变 如果返回到主分支并运行db:migrate,则来自另一个分支的迁移更改将添加到架构中,尽管它不属于主分支 我知道rails就是这样工作的,但是开发人员如何处理这个问题呢 我听说有些人只是使用schema:load让本地数据库与schema同步,但因为它会删除所有数据,所以这对我来说不是一个好的解决方案,因为我使用了大量的sql转储来帮助开发(没有这些数据进行开发非常痛苦,并且

我有一个反映主分支迁移的版本化schema.rb。 每当我转到另一个分支并在该分支中运行新迁移时,我的数据库结构都会改变

如果返回到主分支并运行db:migrate,则来自另一个分支的迁移更改将添加到架构中,尽管它不属于主分支

我知道rails就是这样工作的,但是开发人员如何处理这个问题呢


我听说有些人只是使用schema:load让本地数据库与schema同步,但因为它会删除所有数据,所以这对我来说不是一个好的解决方案,因为我使用了大量的sql转储来帮助开发(没有这些数据进行开发非常痛苦,并且容易产生风险)

为开发使用
生产
转储(使用browser/rails服务器)很好,但是您可能应该有一个
test
环境设置,它使用最小的种子数据库

您可以通过对空(新)数据库执行
RAILS\u ENV=test rake db:schema:load
来实现这一点。 我通常会这样做:

git checkout db/schema.rb
RAILS_ENV=test rake db:reset
RAILS_ENV=test rake db:migrate
并根据需要加载装置。这将为您留下一个模式,该模式应该只包含迁移更改和更改的时间戳(除非您将更改硬编码到模式中,否则在这种情况下,它们将丢失-我们monkeypatched
ActiveRecord::SchemaDumper
,以避免这种情况)


完成迁移并完成此操作后,在将迁移应用于
开发之前提交
schema.rb
和迁移文件。然后,您可以放弃带有不需要的更改的
schema.rb

这看起来更像是git问题,而不是Rails问题。git允许使用新文件进行分支更改,因为它们不会与主分支或您要签出的任何分支发生冲突。在Rails中,创建迁移会在db/migrations目录中创建一个新的未跟踪文件。因为它是一个新文件,所以您可以毫无问题地签出主分支

~/code/node/server (test)
$ git checkout -b dev
Switched to a new branch 'dev'

~/code/node/server (dev)
$ touch test.txt

~/code/node/server (dev)
$ git checkout test
Switched to branch 'test'

~/code/node/server (test)
$ git status
On branch test
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test.txt

nothing added to commit but untracked files present (use "git add" to track)
~/code/node/server(测试)
$git checkout-b dev
切换到新的分支“dev”
~/code/node/server(dev)
$touch test.txt
~/code/node/server(dev)
$git校验测试
切换到分支“测试”
~/code/node/server(测试)
$git状态
分支测试
未跟踪的文件:
(使用“git add…”包含在将提交的内容中)
test.txt
提交时未添加任何内容,但存在未跟踪的文件(使用“git add”跟踪)
在本例中,我从分支“test”开始,然后签出一个名为“dev”的新分支。然后创建一个测试文件并确保不开始跟踪它。然后再次签出“test”分支。(注意这里没有问题)。
git status
显示未跟踪的文件跟随我回到了“test”分支

如果希望迁移文件保持在创建它的非主分支的本地,可以执行以下操作:

  • 您可以将此文件暂存并提交到非主分支。执行此操作后,文件将驻留在该分支上,而不会跟随您返回主分支(或您决定签出的任何其他分支)

  • 您可以暂存此文件,然后将其隐藏:

    • git将路径添加到/your\u文件中
    • git隐藏
    • 要在以后检索存储,您可以
      git stash pop
    • 有关git stash的更多信息,请阅读
  • 删除该文件

  • 如果您无意中迁移了一个分支,则始终可以使用
    bundle exec rake db:rollback
    回滚迁移,直到达到所需的模式状态


    希望这能有所帮助,并且编码愉快!

    您好!感谢您的回复!我可能被误解了。我的意思是,具有不同迁移(因此具有不同模式)的分支强制我们使用schema:load以保持财务数据库结构与dev中的当前分支架构相匹配。当我们需要使用大型生产转储时,这没有帮助,因为我们必须在schema:load之后再次恢复。也许使用转储进行开发的方法不是更好的选择,但我想知道是否有办法保持这种方式